Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1de899d3 authored by Sucheta Chakraborty's avatar Sucheta Chakraborty Committed by David S. Miller
Browse files

qlcnic: dcb code cleanup and refactoring.



o Move dcb specific function definitions to dcb files.
o Move dcb specific variables to qlcnic_dcb structure.

Signed-off-by: default avatarSucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4c776aad
Loading
Loading
Loading
Loading
+0 −96
Original line number Original line Diff line number Diff line
@@ -961,8 +961,6 @@ struct qlcnic_ipaddr {
#define __QLCNIC_SRIOV_CAPABLE		11
#define __QLCNIC_SRIOV_CAPABLE		11
#define __QLCNIC_MBX_POLL_ENABLE	12
#define __QLCNIC_MBX_POLL_ENABLE	12
#define __QLCNIC_DIAG_MODE		13
#define __QLCNIC_DIAG_MODE		13
#define __QLCNIC_DCB_STATE		14
#define __QLCNIC_DCB_IN_AEN		15


#define QLCNIC_INTERRUPT_TEST		1
#define QLCNIC_INTERRUPT_TEST		1
#define QLCNIC_LOOPBACK_TEST		2
#define QLCNIC_LOOPBACK_TEST		2
@@ -2116,98 +2114,4 @@ static inline bool qlcnic_sriov_vf_check(struct qlcnic_adapter *adapter)


	return status;
	return status;
}
}

static inline int qlcnic_dcb_get_hw_capability(struct qlcnic_adapter *adapter)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->get_hw_capability)
		return dcb->ops->get_hw_capability(adapter);

	return 0;
}

static inline void qlcnic_dcb_free(struct qlcnic_adapter *adapter)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->free)
		dcb->ops->free(adapter);
}

static inline int qlcnic_dcb_attach(struct qlcnic_adapter *adapter)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->attach)
		return dcb->ops->attach(adapter);

	return 0;
}

static inline int
qlcnic_dcb_query_hw_capability(struct qlcnic_adapter *adapter, char *buf)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->query_hw_capability)
		return dcb->ops->query_hw_capability(adapter, buf);

	return 0;
}

static inline void qlcnic_dcb_get_info(struct qlcnic_adapter *adapter)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->get_info)
		dcb->ops->get_info(adapter);
}

static inline int
qlcnic_dcb_query_cee_param(struct qlcnic_adapter *adapter, char *buf, u8 type)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->query_cee_param)
		return dcb->ops->query_cee_param(adapter, buf, type);

	return 0;
}

static inline int qlcnic_dcb_get_cee_cfg(struct qlcnic_adapter *adapter)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->get_cee_cfg)
		return dcb->ops->get_cee_cfg(adapter);

	return 0;
}

static inline void
qlcnic_dcb_register_aen(struct qlcnic_adapter *adapter, u8 flag)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->register_aen)
		dcb->ops->register_aen(adapter, flag);
}

static inline void qlcnic_dcb_handle_aen(struct qlcnic_adapter *adapter,
					 void *msg)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->handle_aen)
		dcb->ops->handle_aen(adapter, msg);
}

static inline void qlcnic_dcb_init_dcbnl_ops(struct qlcnic_adapter *adapter)
{
	struct qlcnic_dcb *dcb = adapter->dcb;

	if (dcb && dcb->ops->init_dcbnl_ops)
		dcb->ops->init_dcbnl_ops(adapter);
}
#endif				/* __QLCNIC_H_ */
#endif				/* __QLCNIC_H_ */
+1 −1
Original line number Original line Diff line number Diff line
@@ -902,7 +902,7 @@ void __qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter)
			 QLCNIC_MBX_RSP(event[0]));
			 QLCNIC_MBX_RSP(event[0]));
		break;
		break;
	case QLCNIC_MBX_DCBX_CONFIG_CHANGE_EVENT:
	case QLCNIC_MBX_DCBX_CONFIG_CHANGE_EVENT:
		qlcnic_dcb_handle_aen(adapter, (void *)&event[1]);
		qlcnic_dcb_aen_handler(adapter->dcb, (void *)&event[1]);
		break;
		break;
	default:
	default:
		dev_dbg(&adapter->pdev->dev, "Unsupported AEN:0x%x.\n",
		dev_dbg(&adapter->pdev->dev, "Unsupported AEN:0x%x.\n",
+6 −3
Original line number Original line Diff line number Diff line
@@ -636,7 +636,7 @@ int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
	if (adapter->portnum == 0)
	if (adapter->portnum == 0)
		qlcnic_set_drv_version(adapter);
		qlcnic_set_drv_version(adapter);


	qlcnic_dcb_get_info(adapter);
	qlcnic_dcb_get_info(adapter->dcb);
	qlcnic_83xx_idc_attach_driver(adapter);
	qlcnic_83xx_idc_attach_driver(adapter);


	return 0;
	return 0;
@@ -2174,6 +2174,7 @@ static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter)
int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
{
{
	struct qlcnic_hardware_context *ahw = adapter->ahw;
	struct qlcnic_hardware_context *ahw = adapter->ahw;
	struct qlcnic_dcb *dcb;
	int err = 0;
	int err = 0;


	ahw->msix_supported = !!qlcnic_use_msi_x;
	ahw->msix_supported = !!qlcnic_use_msi_x;
@@ -2231,8 +2232,10 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
	if (err)
	if (err)
		goto disable_mbx_intr;
		goto disable_mbx_intr;


	if (adapter->dcb && qlcnic_dcb_attach(adapter))
	dcb = adapter->dcb;
		qlcnic_clear_dcb_ops(adapter);

	if (dcb && qlcnic_dcb_attach(dcb))
		qlcnic_clear_dcb_ops(dcb);


	/* Periodically monitor device status */
	/* Periodically monitor device status */
	qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
	qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
+89 −95
Original line number Original line Diff line number Diff line
@@ -57,22 +57,22 @@ static const struct dcbnl_rtnl_ops qlcnic_dcbnl_ops;
static void qlcnic_dcb_aen_work(struct work_struct *);
static void qlcnic_dcb_aen_work(struct work_struct *);
static void qlcnic_dcb_data_cee_param_map(struct qlcnic_adapter *);
static void qlcnic_dcb_data_cee_param_map(struct qlcnic_adapter *);


static inline void __qlcnic_init_dcbnl_ops(struct qlcnic_adapter *);
static inline void __qlcnic_init_dcbnl_ops(struct qlcnic_dcb *);
static void __qlcnic_dcb_free(struct qlcnic_adapter *);
static void __qlcnic_dcb_free(struct qlcnic_dcb *);
static int __qlcnic_dcb_attach(struct qlcnic_adapter *);
static int __qlcnic_dcb_attach(struct qlcnic_dcb *);
static int __qlcnic_dcb_query_hw_capability(struct qlcnic_adapter *, char *);
static int __qlcnic_dcb_query_hw_capability(struct qlcnic_dcb *, char *);
static void __qlcnic_dcb_get_info(struct qlcnic_adapter *);
static void __qlcnic_dcb_get_info(struct qlcnic_dcb *);


static int qlcnic_82xx_dcb_get_hw_capability(struct qlcnic_adapter *);
static int qlcnic_82xx_dcb_get_hw_capability(struct qlcnic_dcb *);
static int qlcnic_82xx_dcb_query_cee_param(struct qlcnic_adapter *, char *, u8);
static int qlcnic_82xx_dcb_query_cee_param(struct qlcnic_dcb *, char *, u8);
static int qlcnic_82xx_dcb_get_cee_cfg(struct qlcnic_adapter *);
static int qlcnic_82xx_dcb_get_cee_cfg(struct qlcnic_dcb *);
static void qlcnic_82xx_dcb_handle_aen(struct qlcnic_adapter *, void *);
static void qlcnic_82xx_dcb_aen_handler(struct qlcnic_dcb *, void *);


static int qlcnic_83xx_dcb_get_hw_capability(struct qlcnic_adapter *);
static int qlcnic_83xx_dcb_get_hw_capability(struct qlcnic_dcb *);
static int qlcnic_83xx_dcb_query_cee_param(struct qlcnic_adapter *, char *, u8);
static int qlcnic_83xx_dcb_query_cee_param(struct qlcnic_dcb *, char *, u8);
static int qlcnic_83xx_dcb_get_cee_cfg(struct qlcnic_adapter *);
static int qlcnic_83xx_dcb_get_cee_cfg(struct qlcnic_dcb *);
static int qlcnic_83xx_dcb_register_aen(struct qlcnic_adapter *, bool);
static int qlcnic_83xx_dcb_register_aen(struct qlcnic_dcb *, bool);
static void qlcnic_83xx_dcb_handle_aen(struct qlcnic_adapter *, void *);
static void qlcnic_83xx_dcb_aen_handler(struct qlcnic_dcb *, void *);


struct qlcnic_dcb_capability {
struct qlcnic_dcb_capability {
	bool	tsa_capability;
	bool	tsa_capability;
@@ -180,7 +180,7 @@ static struct qlcnic_dcb_ops qlcnic_83xx_dcb_ops = {
	.query_cee_param	= qlcnic_83xx_dcb_query_cee_param,
	.query_cee_param	= qlcnic_83xx_dcb_query_cee_param,
	.get_cee_cfg		= qlcnic_83xx_dcb_get_cee_cfg,
	.get_cee_cfg		= qlcnic_83xx_dcb_get_cee_cfg,
	.register_aen		= qlcnic_83xx_dcb_register_aen,
	.register_aen		= qlcnic_83xx_dcb_register_aen,
	.handle_aen		= qlcnic_83xx_dcb_handle_aen,
	.aen_handler		= qlcnic_83xx_dcb_aen_handler,
};
};


static struct qlcnic_dcb_ops qlcnic_82xx_dcb_ops = {
static struct qlcnic_dcb_ops qlcnic_82xx_dcb_ops = {
@@ -193,7 +193,7 @@ static struct qlcnic_dcb_ops qlcnic_82xx_dcb_ops = {
	.get_hw_capability	= qlcnic_82xx_dcb_get_hw_capability,
	.get_hw_capability	= qlcnic_82xx_dcb_get_hw_capability,
	.query_cee_param	= qlcnic_82xx_dcb_query_cee_param,
	.query_cee_param	= qlcnic_82xx_dcb_query_cee_param,
	.get_cee_cfg		= qlcnic_82xx_dcb_get_cee_cfg,
	.get_cee_cfg		= qlcnic_82xx_dcb_get_cee_cfg,
	.handle_aen		= qlcnic_82xx_dcb_handle_aen,
	.aen_handler		= qlcnic_82xx_dcb_aen_handler,
};
};


static u8 qlcnic_dcb_get_num_app(struct qlcnic_adapter *adapter, u32 val)
static u8 qlcnic_dcb_get_num_app(struct qlcnic_adapter *adapter, u32 val)
@@ -242,10 +242,10 @@ static int qlcnic_dcb_prio_count(u8 up_tc_map)
	return j;
	return j;
}
}


static inline void __qlcnic_init_dcbnl_ops(struct qlcnic_adapter *adapter)
static inline void __qlcnic_init_dcbnl_ops(struct qlcnic_dcb *dcb)
{
{
	if (test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (test_bit(QLCNIC_DCB_STATE, &dcb->state))
		adapter->netdev->dcbnl_ops = &qlcnic_dcbnl_ops;
		dcb->adapter->netdev->dcbnl_ops = &qlcnic_dcbnl_ops;
}
}


static void qlcnic_set_dcb_ops(struct qlcnic_adapter *adapter)
static void qlcnic_set_dcb_ops(struct qlcnic_adapter *adapter)
@@ -256,7 +256,7 @@ static void qlcnic_set_dcb_ops(struct qlcnic_adapter *adapter)
		adapter->dcb->ops = &qlcnic_83xx_dcb_ops;
		adapter->dcb->ops = &qlcnic_83xx_dcb_ops;
}
}


int __qlcnic_register_dcb(struct qlcnic_adapter *adapter)
int qlcnic_register_dcb(struct qlcnic_adapter *adapter)
{
{
	struct qlcnic_dcb *dcb;
	struct qlcnic_dcb *dcb;


@@ -267,20 +267,22 @@ int __qlcnic_register_dcb(struct qlcnic_adapter *adapter)
	adapter->dcb = dcb;
	adapter->dcb = dcb;
	dcb->adapter = adapter;
	dcb->adapter = adapter;
	qlcnic_set_dcb_ops(adapter);
	qlcnic_set_dcb_ops(adapter);
	dcb->state = 0;


	return 0;
	return 0;
}
}


static void __qlcnic_dcb_free(struct qlcnic_adapter *adapter)
static void __qlcnic_dcb_free(struct qlcnic_dcb *dcb)
{
{
	struct qlcnic_dcb *dcb = adapter->dcb;
	struct qlcnic_adapter *adapter;


	if (!dcb)
	if (!dcb)
		return;
		return;


	qlcnic_dcb_register_aen(adapter, 0);
	adapter = dcb->adapter;
	qlcnic_dcb_register_aen(dcb, 0);


	while (test_bit(__QLCNIC_DCB_IN_AEN, &adapter->state))
	while (test_bit(QLCNIC_DCB_AEN_MODE, &dcb->state))
		usleep_range(10000, 11000);
		usleep_range(10000, 11000);


	cancel_delayed_work_sync(&dcb->aen_work);
	cancel_delayed_work_sync(&dcb->aen_work);
@@ -298,23 +300,22 @@ static void __qlcnic_dcb_free(struct qlcnic_adapter *adapter)
	adapter->dcb = NULL;
	adapter->dcb = NULL;
}
}


static void __qlcnic_dcb_get_info(struct qlcnic_adapter *adapter)
static void __qlcnic_dcb_get_info(struct qlcnic_dcb *dcb)
{
{
	qlcnic_dcb_get_hw_capability(adapter);
	qlcnic_dcb_get_hw_capability(dcb);
	qlcnic_dcb_get_cee_cfg(adapter);
	qlcnic_dcb_get_cee_cfg(dcb);
	qlcnic_dcb_register_aen(adapter, 1);
	qlcnic_dcb_register_aen(dcb, 1);
}
}


static int __qlcnic_dcb_attach(struct qlcnic_adapter *adapter)
static int __qlcnic_dcb_attach(struct qlcnic_dcb *dcb)
{
{
	struct qlcnic_dcb *dcb = adapter->dcb;
	int err = 0;
	int err = 0;


	INIT_DELAYED_WORK(&dcb->aen_work, qlcnic_dcb_aen_work);
	INIT_DELAYED_WORK(&dcb->aen_work, qlcnic_dcb_aen_work);


	dcb->wq = create_singlethread_workqueue("qlcnic-dcb");
	dcb->wq = create_singlethread_workqueue("qlcnic-dcb");
	if (!dcb->wq) {
	if (!dcb->wq) {
		dev_err(&adapter->pdev->dev,
		dev_err(&dcb->adapter->pdev->dev,
			"DCB workqueue allocation failed. DCB will be disabled\n");
			"DCB workqueue allocation failed. DCB will be disabled\n");
		return -1;
		return -1;
	}
	}
@@ -331,7 +332,7 @@ static int __qlcnic_dcb_attach(struct qlcnic_adapter *adapter)
		goto out_free_cfg;
		goto out_free_cfg;
	}
	}


	qlcnic_dcb_get_info(adapter);
	qlcnic_dcb_get_info(dcb);


	return 0;
	return 0;
out_free_cfg:
out_free_cfg:
@@ -345,9 +346,9 @@ out_free_wq:
	return err;
	return err;
}
}


static int __qlcnic_dcb_query_hw_capability(struct qlcnic_adapter *adapter,
static int __qlcnic_dcb_query_hw_capability(struct qlcnic_dcb *dcb, char *buf)
					    char *buf)
{
{
	struct qlcnic_adapter *adapter = dcb->adapter;
	struct qlcnic_cmd_args cmd;
	struct qlcnic_cmd_args cmd;
	u32 mbx_out;
	u32 mbx_out;
	int err;
	int err;
@@ -371,15 +372,15 @@ static int __qlcnic_dcb_query_hw_capability(struct qlcnic_adapter *adapter,
	return err;
	return err;
}
}


static int __qlcnic_dcb_get_capability(struct qlcnic_adapter *adapter, u32 *val)
static int __qlcnic_dcb_get_capability(struct qlcnic_dcb *dcb, u32 *val)
{
{
	struct qlcnic_dcb_capability *cap = &adapter->dcb->cfg->capability;
	struct qlcnic_dcb_capability *cap = &dcb->cfg->capability;
	u32 mbx_out;
	u32 mbx_out;
	int err;
	int err;


	memset(cap, 0, sizeof(struct qlcnic_dcb_capability));
	memset(cap, 0, sizeof(struct qlcnic_dcb_capability));


	err = qlcnic_dcb_query_hw_capability(adapter, (char *)val);
	err = qlcnic_dcb_query_hw_capability(dcb, (char *)val);
	if (err)
	if (err)
		return err;
		return err;


@@ -397,21 +398,21 @@ static int __qlcnic_dcb_get_capability(struct qlcnic_adapter *adapter, u32 *val)
	if (cap->max_num_tc > QLC_DCB_MAX_TC ||
	if (cap->max_num_tc > QLC_DCB_MAX_TC ||
	    cap->max_ets_tc > cap->max_num_tc ||
	    cap->max_ets_tc > cap->max_num_tc ||
	    cap->max_pfc_tc > cap->max_num_tc) {
	    cap->max_pfc_tc > cap->max_num_tc) {
		dev_err(&adapter->pdev->dev, "Invalid DCB configuration\n");
		dev_err(&dcb->adapter->pdev->dev, "Invalid DCB configuration\n");
		return -EINVAL;
		return -EINVAL;
	}
	}


	return err;
	return err;
}
}


static int qlcnic_82xx_dcb_get_hw_capability(struct qlcnic_adapter *adapter)
static int qlcnic_82xx_dcb_get_hw_capability(struct qlcnic_dcb *dcb)
{
{
	struct qlcnic_dcb_cfg *cfg = adapter->dcb->cfg;
	struct qlcnic_dcb_cfg *cfg = dcb->cfg;
	struct qlcnic_dcb_capability *cap;
	struct qlcnic_dcb_capability *cap;
	u32 mbx_out;
	u32 mbx_out;
	int err;
	int err;


	err = __qlcnic_dcb_get_capability(adapter, &mbx_out);
	err = __qlcnic_dcb_get_capability(dcb, &mbx_out);
	if (err)
	if (err)
		return err;
		return err;


@@ -419,15 +420,16 @@ static int qlcnic_82xx_dcb_get_hw_capability(struct qlcnic_adapter *adapter)
	cap->dcb_capability = DCB_CAP_DCBX_VER_CEE | DCB_CAP_DCBX_LLD_MANAGED;
	cap->dcb_capability = DCB_CAP_DCBX_VER_CEE | DCB_CAP_DCBX_LLD_MANAGED;


	if (cap->dcb_capability && cap->tsa_capability && cap->ets_capability)
	if (cap->dcb_capability && cap->tsa_capability && cap->ets_capability)
		set_bit(__QLCNIC_DCB_STATE, &adapter->state);
		set_bit(QLCNIC_DCB_STATE, &dcb->state);


	return err;
	return err;
}
}


static int qlcnic_82xx_dcb_query_cee_param(struct qlcnic_adapter *adapter,
static int qlcnic_82xx_dcb_query_cee_param(struct qlcnic_dcb *dcb,
					   char *buf, u8 type)
					   char *buf, u8 type)
{
{
	u16 size = sizeof(struct qlcnic_82xx_dcb_param_mbx_le);
	u16 size = sizeof(struct qlcnic_82xx_dcb_param_mbx_le);
	struct qlcnic_adapter *adapter = dcb->adapter;
	struct qlcnic_82xx_dcb_param_mbx_le *prsp_le;
	struct qlcnic_82xx_dcb_param_mbx_le *prsp_le;
	struct device *dev = &adapter->pdev->dev;
	struct device *dev = &adapter->pdev->dev;
	dma_addr_t cardrsp_phys_addr;
	dma_addr_t cardrsp_phys_addr;
@@ -447,8 +449,7 @@ static int qlcnic_82xx_dcb_query_cee_param(struct qlcnic_adapter *adapter,
		return -EINVAL;
		return -EINVAL;
	}
	}


	addr = dma_alloc_coherent(&adapter->pdev->dev, size, &cardrsp_phys_addr,
	addr = dma_alloc_coherent(dev, size, &cardrsp_phys_addr, GFP_KERNEL);
				  GFP_KERNEL);
	if (addr == NULL)
	if (addr == NULL)
		return -ENOMEM;
		return -ENOMEM;


@@ -488,72 +489,67 @@ out:
	qlcnic_free_mbx_args(&cmd);
	qlcnic_free_mbx_args(&cmd);


out_free_rsp:
out_free_rsp:
	dma_free_coherent(&adapter->pdev->dev, size, addr, cardrsp_phys_addr);
	dma_free_coherent(dev, size, addr, cardrsp_phys_addr);


	return err;
	return err;
}
}


static int qlcnic_82xx_dcb_get_cee_cfg(struct qlcnic_adapter *adapter)
static int qlcnic_82xx_dcb_get_cee_cfg(struct qlcnic_dcb *dcb)
{
{
	struct qlcnic_dcb_mbx_params *mbx;
	struct qlcnic_dcb_mbx_params *mbx;
	int err;
	int err;


	mbx = adapter->dcb->param;
	mbx = dcb->param;
	if (!mbx)
	if (!mbx)
		return 0;
		return 0;


	err = qlcnic_dcb_query_cee_param(adapter, (char *)&mbx->type[0],
	err = qlcnic_dcb_query_cee_param(dcb, (char *)&mbx->type[0],
					 QLC_DCB_LOCAL_PARAM_FWID);
					 QLC_DCB_LOCAL_PARAM_FWID);
	if (err)
	if (err)
		return err;
		return err;


	err = qlcnic_dcb_query_cee_param(adapter, (char *)&mbx->type[1],
	err = qlcnic_dcb_query_cee_param(dcb, (char *)&mbx->type[1],
					 QLC_DCB_OPER_PARAM_FWID);
					 QLC_DCB_OPER_PARAM_FWID);
	if (err)
	if (err)
		return err;
		return err;


	err = qlcnic_dcb_query_cee_param(adapter, (char *)&mbx->type[2],
	err = qlcnic_dcb_query_cee_param(dcb, (char *)&mbx->type[2],
					 QLC_DCB_PEER_PARAM_FWID);
					 QLC_DCB_PEER_PARAM_FWID);
	if (err)
	if (err)
		return err;
		return err;


	mbx->prio_tc_map = QLC_82XX_DCB_PRIO_TC_MAP;
	mbx->prio_tc_map = QLC_82XX_DCB_PRIO_TC_MAP;


	qlcnic_dcb_data_cee_param_map(adapter);
	qlcnic_dcb_data_cee_param_map(dcb->adapter);


	return err;
	return err;
}
}


static void qlcnic_dcb_aen_work(struct work_struct *work)
static void qlcnic_dcb_aen_work(struct work_struct *work)
{
{
	struct qlcnic_adapter *adapter;
	struct qlcnic_dcb *dcb;
	struct qlcnic_dcb *dcb;


	dcb = container_of(work, struct qlcnic_dcb, aen_work.work);
	dcb = container_of(work, struct qlcnic_dcb, aen_work.work);
	adapter = dcb->adapter;


	qlcnic_dcb_get_cee_cfg(adapter);
	qlcnic_dcb_get_cee_cfg(dcb);
	clear_bit(__QLCNIC_DCB_IN_AEN, &adapter->state);
	clear_bit(QLCNIC_DCB_AEN_MODE, &dcb->state);
}
}


static void qlcnic_82xx_dcb_handle_aen(struct qlcnic_adapter *adapter,
static void qlcnic_82xx_dcb_aen_handler(struct qlcnic_dcb *dcb, void *data)
				       void *data)
{
{
	struct qlcnic_dcb *dcb = adapter->dcb;
	if (test_and_set_bit(QLCNIC_DCB_AEN_MODE, &dcb->state))

	if (test_and_set_bit(__QLCNIC_DCB_IN_AEN, &adapter->state))
		return;
		return;


	queue_delayed_work(dcb->wq, &dcb->aen_work, 0);
	queue_delayed_work(dcb->wq, &dcb->aen_work, 0);
}
}


static int qlcnic_83xx_dcb_get_hw_capability(struct qlcnic_adapter *adapter)
static int qlcnic_83xx_dcb_get_hw_capability(struct qlcnic_dcb *dcb)
{
{
	struct qlcnic_dcb_capability *cap = &adapter->dcb->cfg->capability;
	struct qlcnic_dcb_capability *cap = &dcb->cfg->capability;
	u32 mbx_out;
	u32 mbx_out;
	int err;
	int err;


	err = __qlcnic_dcb_get_capability(adapter, &mbx_out);
	err = __qlcnic_dcb_get_capability(dcb, &mbx_out);
	if (err)
	if (err)
		return err;
		return err;


@@ -565,14 +561,15 @@ static int qlcnic_83xx_dcb_get_hw_capability(struct qlcnic_adapter *adapter)
		cap->dcb_capability |= DCB_CAP_DCBX_LLD_MANAGED;
		cap->dcb_capability |= DCB_CAP_DCBX_LLD_MANAGED;


	if (cap->dcb_capability && cap->tsa_capability && cap->ets_capability)
	if (cap->dcb_capability && cap->tsa_capability && cap->ets_capability)
		set_bit(__QLCNIC_DCB_STATE, &adapter->state);
		set_bit(QLCNIC_DCB_STATE, &dcb->state);


	return err;
	return err;
}
}


static int qlcnic_83xx_dcb_query_cee_param(struct qlcnic_adapter *adapter,
static int qlcnic_83xx_dcb_query_cee_param(struct qlcnic_dcb *dcb,
					   char *buf, u8 idx)
					   char *buf, u8 idx)
{
{
	struct qlcnic_adapter *adapter = dcb->adapter;
	struct qlcnic_dcb_mbx_params mbx_out;
	struct qlcnic_dcb_mbx_params mbx_out;
	int err, i, j, k, max_app, size;
	int err, i, j, k, max_app, size;
	struct qlcnic_dcb_param *each;
	struct qlcnic_dcb_param *each;
@@ -632,24 +629,23 @@ out:
	return err;
	return err;
}
}


static int qlcnic_83xx_dcb_get_cee_cfg(struct qlcnic_adapter *adapter)
static int qlcnic_83xx_dcb_get_cee_cfg(struct qlcnic_dcb *dcb)
{
{
	struct qlcnic_dcb *dcb = adapter->dcb;
	int err;
	int err;


	err = qlcnic_dcb_query_cee_param(adapter, (char *)dcb->param, 0);
	err = qlcnic_dcb_query_cee_param(dcb, (char *)dcb->param, 0);
	if (err)
	if (err)
		return err;
		return err;


	qlcnic_dcb_data_cee_param_map(adapter);
	qlcnic_dcb_data_cee_param_map(dcb->adapter);


	return err;
	return err;
}
}


static int qlcnic_83xx_dcb_register_aen(struct qlcnic_adapter *adapter,
static int qlcnic_83xx_dcb_register_aen(struct qlcnic_dcb *dcb, bool flag)
					bool flag)
{
{
	u8 val = (flag ? QLCNIC_CMD_INIT_NIC_FUNC : QLCNIC_CMD_STOP_NIC_FUNC);
	u8 val = (flag ? QLCNIC_CMD_INIT_NIC_FUNC : QLCNIC_CMD_STOP_NIC_FUNC);
	struct qlcnic_adapter *adapter = dcb->adapter;
	struct qlcnic_cmd_args cmd;
	struct qlcnic_cmd_args cmd;
	int err;
	int err;


@@ -669,19 +665,17 @@ static int qlcnic_83xx_dcb_register_aen(struct qlcnic_adapter *adapter,
	return err;
	return err;
}
}


static void qlcnic_83xx_dcb_handle_aen(struct qlcnic_adapter *adapter,
static void qlcnic_83xx_dcb_aen_handler(struct qlcnic_dcb *dcb, void *data)
				       void *data)
{
{
	struct qlcnic_dcb *dcb = adapter->dcb;
	u32 *val = data;
	u32 *val = data;


	if (test_and_set_bit(__QLCNIC_DCB_IN_AEN, &adapter->state))
	if (test_and_set_bit(QLCNIC_DCB_AEN_MODE, &dcb->state))
		return;
		return;


	if (*val & BIT_8)
	if (*val & BIT_8)
		set_bit(__QLCNIC_DCB_STATE, &adapter->state);
		set_bit(QLCNIC_DCB_STATE, &dcb->state);
	else
	else
		clear_bit(__QLCNIC_DCB_STATE, &adapter->state);
		clear_bit(QLCNIC_DCB_STATE, &dcb->state);


	queue_delayed_work(dcb->wq, &dcb->aen_work, 0);
	queue_delayed_work(dcb->wq, &dcb->aen_work, 0);
}
}
@@ -814,12 +808,12 @@ static u8 qlcnic_dcb_get_state(struct net_device *netdev)
{
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_adapter *adapter = netdev_priv(netdev);


	return test_bit(__QLCNIC_DCB_STATE, &adapter->state);
	return test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state);
}
}


static void qlcnic_dcb_get_perm_hw_addr(struct net_device *netdev, u8 *addr)
static void qlcnic_dcb_get_perm_hw_addr(struct net_device *netdev, u8 *addr)
{
{
	memcpy(addr, netdev->dev_addr, netdev->addr_len);
	memcpy(addr, netdev->perm_addr, netdev->addr_len);
}
}


static void
static void
@@ -834,7 +828,7 @@ qlcnic_dcb_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, u8 *prio,
	type = &adapter->dcb->cfg->type[QLC_DCB_OPER_IDX];
	type = &adapter->dcb->cfg->type[QLC_DCB_OPER_IDX];
	*prio = *pgid = *bw_per = *up_tc_map = 0;
	*prio = *pgid = *bw_per = *up_tc_map = 0;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state) ||
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state) ||
	    !type->tc_param_valid)
	    !type->tc_param_valid)
		return;
		return;


@@ -870,7 +864,7 @@ static void qlcnic_dcb_get_pg_bwg_cfg_tx(struct net_device *netdev, int pgid,
	*bw_pct = 0;
	*bw_pct = 0;
	type = &adapter->dcb->cfg->type[QLC_DCB_OPER_IDX];
	type = &adapter->dcb->cfg->type[QLC_DCB_OPER_IDX];


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state) ||
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state) ||
	    !type->tc_param_valid)
	    !type->tc_param_valid)
		return;
		return;


@@ -896,7 +890,7 @@ static void qlcnic_dcb_get_pfc_cfg(struct net_device *netdev, int prio,
	*setting = 0;
	*setting = 0;
	type = &adapter->dcb->cfg->type[QLC_DCB_OPER_IDX];
	type = &adapter->dcb->cfg->type[QLC_DCB_OPER_IDX];


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state) ||
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state) ||
	    !type->pfc_mode_enable)
	    !type->pfc_mode_enable)
		return;
		return;


@@ -915,7 +909,7 @@ static u8 qlcnic_dcb_get_capability(struct net_device *netdev, int capid,
{
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_adapter *adapter = netdev_priv(netdev);


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return 0;
		return 0;


	switch (capid) {
	switch (capid) {
@@ -944,7 +938,7 @@ static int qlcnic_dcb_get_num_tcs(struct net_device *netdev, int attr, u8 *num)
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_dcb_cfg *cfg = adapter->dcb->cfg;
	struct qlcnic_dcb_cfg *cfg = adapter->dcb->cfg;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return -EINVAL;
		return -EINVAL;


	switch (attr) {
	switch (attr) {
@@ -967,7 +961,7 @@ static u8 qlcnic_dcb_get_app(struct net_device *netdev, u8 idtype, u16 id)
				.protocol = id,
				.protocol = id,
			     };
			     };


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return 0;
		return 0;


	return dcb_getapp(netdev, &app);
	return dcb_getapp(netdev, &app);
@@ -978,7 +972,7 @@ static u8 qlcnic_dcb_get_pfc_state(struct net_device *netdev)
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_dcb *dcb = adapter->dcb;
	struct qlcnic_dcb *dcb = adapter->dcb;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &dcb->state))
		return 0;
		return 0;


	return dcb->cfg->type[QLC_DCB_OPER_IDX].pfc_mode_enable;
	return dcb->cfg->type[QLC_DCB_OPER_IDX].pfc_mode_enable;
@@ -989,7 +983,7 @@ static u8 qlcnic_dcb_get_dcbx(struct net_device *netdev)
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_dcb_cfg *cfg = adapter->dcb->cfg;
	struct qlcnic_dcb_cfg *cfg = adapter->dcb->cfg;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return 0;
		return 0;


	return cfg->capability.dcb_capability;
	return cfg->capability.dcb_capability;
@@ -1000,7 +994,7 @@ static u8 qlcnic_dcb_get_feat_cfg(struct net_device *netdev, int fid, u8 *flag)
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_dcb_cee *type;
	struct qlcnic_dcb_cee *type;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return 1;
		return 1;


	type = &adapter->dcb->cfg->type[QLC_DCB_OPER_IDX];
	type = &adapter->dcb->cfg->type[QLC_DCB_OPER_IDX];
@@ -1055,7 +1049,7 @@ static int qlcnic_dcb_peer_app_info(struct net_device *netdev,


	*app_count = 0;
	*app_count = 0;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return 0;
		return 0;


	peer = &adapter->dcb->cfg->type[QLC_DCB_PEER_IDX];
	peer = &adapter->dcb->cfg->type[QLC_DCB_PEER_IDX];
@@ -1076,7 +1070,7 @@ static int qlcnic_dcb_peer_app_table(struct net_device *netdev,
	struct qlcnic_dcb_app *app;
	struct qlcnic_dcb_app *app;
	int i, j;
	int i, j;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return 0;
		return 0;


	peer = &adapter->dcb->cfg->type[QLC_DCB_PEER_IDX];
	peer = &adapter->dcb->cfg->type[QLC_DCB_PEER_IDX];
@@ -1101,7 +1095,7 @@ static int qlcnic_dcb_cee_peer_get_pg(struct net_device *netdev,
	struct qlcnic_dcb_cee *peer;
	struct qlcnic_dcb_cee *peer;
	u8 i, j, k, map;
	u8 i, j, k, map;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return 0;
		return 0;


	peer = &adapter->dcb->cfg->type[QLC_DCB_PEER_IDX];
	peer = &adapter->dcb->cfg->type[QLC_DCB_PEER_IDX];
@@ -1136,7 +1130,7 @@ static int qlcnic_dcb_cee_peer_get_pfc(struct net_device *netdev,


	pfc->pfc_en = 0;
	pfc->pfc_en = 0;


	if (!test_bit(__QLCNIC_DCB_STATE, &adapter->state))
	if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state))
		return 0;
		return 0;


	peer = &cfg->type[QLC_DCB_PEER_IDX];
	peer = &cfg->type[QLC_DCB_PEER_IDX];
+96 −13
Original line number Original line Diff line number Diff line
@@ -8,26 +8,29 @@
#ifndef __QLCNIC_DCBX_H
#ifndef __QLCNIC_DCBX_H
#define __QLCNIC_DCBX_H
#define __QLCNIC_DCBX_H


void qlcnic_clear_dcb_ops(struct qlcnic_adapter *);
#define QLCNIC_DCB_STATE	0
#define QLCNIC_DCB_AEN_MODE	1


#ifdef CONFIG_QLCNIC_DCB
#ifdef CONFIG_QLCNIC_DCB
int __qlcnic_register_dcb(struct qlcnic_adapter *);
int qlcnic_register_dcb(struct qlcnic_adapter *);
#else
#else
static inline int __qlcnic_register_dcb(struct qlcnic_adapter *adapter)
static inline int qlcnic_register_dcb(struct qlcnic_adapter *adapter)
{ return 0; }
{ return 0; }
#endif
#endif


struct qlcnic_dcb;

struct qlcnic_dcb_ops {
struct qlcnic_dcb_ops {
	void (*init_dcbnl_ops) (struct qlcnic_adapter *);
	int (*query_hw_capability) (struct qlcnic_dcb *, char *);
	void (*free) (struct qlcnic_adapter *);
	int (*get_hw_capability) (struct qlcnic_dcb *);
	int (*attach) (struct qlcnic_adapter *);
	int (*query_cee_param) (struct qlcnic_dcb *, char *, u8);
	int (*query_hw_capability) (struct qlcnic_adapter *, char *);
	void (*init_dcbnl_ops) (struct qlcnic_dcb *);
	int (*get_hw_capability) (struct qlcnic_adapter *);
	int (*register_aen) (struct qlcnic_dcb *, bool);
	void (*get_info) (struct qlcnic_adapter *);
	void (*aen_handler) (struct qlcnic_dcb *, void *);
	int (*query_cee_param) (struct qlcnic_adapter *, char *, u8);
	int (*get_cee_cfg) (struct qlcnic_dcb *);
	int (*get_cee_cfg) (struct qlcnic_adapter *);
	void (*get_info) (struct qlcnic_dcb *);
	int (*register_aen) (struct qlcnic_adapter *, bool);
	int (*attach) (struct qlcnic_dcb *);
	void (*handle_aen) (struct qlcnic_adapter *, void *);
	void (*free) (struct qlcnic_dcb *);
};
};


struct qlcnic_dcb {
struct qlcnic_dcb {
@@ -37,5 +40,85 @@ struct qlcnic_dcb {
	struct workqueue_struct		*wq;
	struct workqueue_struct		*wq;
	struct qlcnic_dcb_ops		*ops;
	struct qlcnic_dcb_ops		*ops;
	struct qlcnic_dcb_cfg		*cfg;
	struct qlcnic_dcb_cfg		*cfg;
	unsigned long			state;
};
};

static inline void qlcnic_clear_dcb_ops(struct qlcnic_dcb *dcb)
{
	kfree(dcb);
	dcb = NULL;
}

static inline int qlcnic_dcb_get_hw_capability(struct qlcnic_dcb *dcb)
{
	if (dcb && dcb->ops->get_hw_capability)
		return dcb->ops->get_hw_capability(dcb);

	return 0;
}

static inline void qlcnic_dcb_free(struct qlcnic_dcb *dcb)
{
	if (dcb && dcb->ops->free)
		dcb->ops->free(dcb);
}

static inline int qlcnic_dcb_attach(struct qlcnic_dcb *dcb)
{
	if (dcb && dcb->ops->attach)
		return dcb->ops->attach(dcb);

	return 0;
}

static inline int
qlcnic_dcb_query_hw_capability(struct qlcnic_dcb *dcb, char *buf)
{
	if (dcb && dcb->ops->query_hw_capability)
		return dcb->ops->query_hw_capability(dcb, buf);

	return 0;
}

static inline void qlcnic_dcb_get_info(struct qlcnic_dcb *dcb)
{
	if (dcb && dcb->ops->get_info)
		dcb->ops->get_info(dcb);
}

static inline int
qlcnic_dcb_query_cee_param(struct qlcnic_dcb *dcb, char *buf, u8 type)
{
	if (dcb && dcb->ops->query_cee_param)
		return dcb->ops->query_cee_param(dcb, buf, type);

	return 0;
}

static inline int qlcnic_dcb_get_cee_cfg(struct qlcnic_dcb *dcb)
{
	if (dcb && dcb->ops->get_cee_cfg)
		return dcb->ops->get_cee_cfg(dcb);

	return 0;
}

static inline void
qlcnic_dcb_register_aen(struct qlcnic_dcb *dcb, u8 flag)
{
	if (dcb && dcb->ops->register_aen)
		dcb->ops->register_aen(dcb, flag);
}

static inline void qlcnic_dcb_aen_handler(struct qlcnic_dcb *dcb, void *msg)
{
	if (dcb && dcb->ops->aen_handler)
		dcb->ops->aen_handler(dcb, msg);
}

static inline void qlcnic_dcb_init_dcbnl_ops(struct qlcnic_dcb *dcb)
{
	if (dcb && dcb->ops->init_dcbnl_ops)
		dcb->ops->init_dcbnl_ops(dcb);
}
#endif
#endif
Loading