114d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty/*
214d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty * QLogic qlcnic NIC Driver
314d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty * Copyright (c)  2009-2013 QLogic Corporation
414d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty *
514d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty * See LICENSE.qlcnic for copyright and licensing details.
614d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty */
714d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty
814d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty#ifndef __QLCNIC_DCBX_H
914d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty#define __QLCNIC_DCBX_H
1014d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty
111de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty#define QLCNIC_DCB_STATE	0
121de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty#define QLCNIC_DCB_AEN_MODE	1
1314d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty
1414d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty#ifdef CONFIG_QLCNIC_DCB
151de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortyint qlcnic_register_dcb(struct qlcnic_adapter *);
1614d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty#else
171de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline int qlcnic_register_dcb(struct qlcnic_adapter *adapter)
1814d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty{ return 0; }
1914d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty#endif
2014d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty
211de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystruct qlcnic_dcb;
221de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
2314d385b9905920cc0136721316c185c45ee6e26cSucheta Chakrabortystruct qlcnic_dcb_ops {
241de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	int (*query_hw_capability) (struct qlcnic_dcb *, char *);
251de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	int (*get_hw_capability) (struct qlcnic_dcb *);
261de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	int (*query_cee_param) (struct qlcnic_dcb *, char *, u8);
271de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	void (*init_dcbnl_ops) (struct qlcnic_dcb *);
281de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	void (*aen_handler) (struct qlcnic_dcb *, void *);
291de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	int (*get_cee_cfg) (struct qlcnic_dcb *);
301de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	void (*get_info) (struct qlcnic_dcb *);
311de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	int (*attach) (struct qlcnic_dcb *);
321de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	void (*free) (struct qlcnic_dcb *);
3314d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty};
3414d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty
3514d385b9905920cc0136721316c185c45ee6e26cSucheta Chakrabortystruct qlcnic_dcb {
36fb859ed6916faeae6b44027d2e0738836a11e8c1Sucheta Chakraborty	struct qlcnic_dcb_mbx_params	*param;
372d8ebcab86051f2cd7f207edb513995348b78213Sucheta Chakraborty	struct qlcnic_adapter		*adapter;
382d8ebcab86051f2cd7f207edb513995348b78213Sucheta Chakraborty	struct delayed_work		aen_work;
392d8ebcab86051f2cd7f207edb513995348b78213Sucheta Chakraborty	struct workqueue_struct		*wq;
40fb859ed6916faeae6b44027d2e0738836a11e8c1Sucheta Chakraborty	struct qlcnic_dcb_ops		*ops;
41fb859ed6916faeae6b44027d2e0738836a11e8c1Sucheta Chakraborty	struct qlcnic_dcb_cfg		*cfg;
421de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	unsigned long			state;
4314d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty};
441de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
451de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline void qlcnic_clear_dcb_ops(struct qlcnic_dcb *dcb)
461de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
471de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	kfree(dcb);
481de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	dcb = NULL;
491de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
501de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
511de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline int qlcnic_dcb_get_hw_capability(struct qlcnic_dcb *dcb)
521de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
531de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->get_hw_capability)
541de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		return dcb->ops->get_hw_capability(dcb);
551de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
561de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	return 0;
571de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
581de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
591de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline void qlcnic_dcb_free(struct qlcnic_dcb *dcb)
601de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
611de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->free)
621de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		dcb->ops->free(dcb);
631de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
641de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
651de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline int qlcnic_dcb_attach(struct qlcnic_dcb *dcb)
661de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
671de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->attach)
681de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		return dcb->ops->attach(dcb);
691de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
701de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	return 0;
711de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
721de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
731de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline int
741de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortyqlcnic_dcb_query_hw_capability(struct qlcnic_dcb *dcb, char *buf)
751de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
761de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->query_hw_capability)
771de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		return dcb->ops->query_hw_capability(dcb, buf);
781de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
791de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	return 0;
801de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
811de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
821de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline void qlcnic_dcb_get_info(struct qlcnic_dcb *dcb)
831de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
841de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->get_info)
851de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		dcb->ops->get_info(dcb);
861de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
871de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
881de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline int
891de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortyqlcnic_dcb_query_cee_param(struct qlcnic_dcb *dcb, char *buf, u8 type)
901de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
911de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->query_cee_param)
921de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		return dcb->ops->query_cee_param(dcb, buf, type);
931de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
941de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	return 0;
951de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
961de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
971de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline int qlcnic_dcb_get_cee_cfg(struct qlcnic_dcb *dcb)
981de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
991de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->get_cee_cfg)
1001de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		return dcb->ops->get_cee_cfg(dcb);
1011de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
1021de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	return 0;
1031de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
1041de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
1051de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline void qlcnic_dcb_aen_handler(struct qlcnic_dcb *dcb, void *msg)
1061de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
1071de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->aen_handler)
1081de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		dcb->ops->aen_handler(dcb, msg);
1091de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
1101de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty
1111de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakrabortystatic inline void qlcnic_dcb_init_dcbnl_ops(struct qlcnic_dcb *dcb)
1121de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty{
1131de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty	if (dcb && dcb->ops->init_dcbnl_ops)
1141de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty		dcb->ops->init_dcbnl_ops(dcb);
1151de899d3815fd945b0c2285a4e07fea8eaedf2aaSucheta Chakraborty}
1163c44bba1d270cb1620b4fe76786d0968118cb86bSucheta Chakraborty
1173c44bba1d270cb1620b4fe76786d0968118cb86bSucheta Chakrabortystatic inline void qlcnic_dcb_enable(struct qlcnic_dcb *dcb)
1183c44bba1d270cb1620b4fe76786d0968118cb86bSucheta Chakraborty{
1193c44bba1d270cb1620b4fe76786d0968118cb86bSucheta Chakraborty	if (dcb && qlcnic_dcb_attach(dcb))
1203c44bba1d270cb1620b4fe76786d0968118cb86bSucheta Chakraborty		qlcnic_clear_dcb_ops(dcb);
1213c44bba1d270cb1620b4fe76786d0968118cb86bSucheta Chakraborty}
12214d385b9905920cc0136721316c185c45ee6e26cSucheta Chakraborty#endif
123