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

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
...@@ -961,8 +961,6 @@ struct qlcnic_ipaddr { ...@@ -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) ...@@ -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_ */
...@@ -902,7 +902,7 @@ void __qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter) ...@@ -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",
......
...@@ -636,7 +636,7 @@ int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter) ...@@ -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) ...@@ -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) ...@@ -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);
......
...@@ -57,22 +57,22 @@ static const struct dcbnl_rtnl_ops qlcnic_dcbnl_ops; ...@@ -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 = { ...@@ -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 = { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ static int __qlcnic_dcb_attach(struct qlcnic_adapter *adapter) ...@@ -345,9 +346,9 @@ static int __qlcnic_dcb_attach(struct qlcnic_adapter *adapter)
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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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 @@ static int qlcnic_82xx_dcb_query_cee_param(struct qlcnic_adapter *adapter, ...@@ -488,72 +489,67 @@ static int qlcnic_82xx_dcb_query_cee_param(struct qlcnic_adapter *adapter,
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) ...@@ -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 @@ static int qlcnic_83xx_dcb_query_cee_param(struct qlcnic_adapter *adapter, ...@@ -632,24 +629,23 @@ static int qlcnic_83xx_dcb_query_cee_param(struct qlcnic_adapter *adapter,
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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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];
......
...@@ -8,26 +8,29 @@ ...@@ -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 { ...@@ -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
...@@ -1011,7 +1011,7 @@ static void qlcnic_handle_fw_message(int desc_cnt, int index, ...@@ -1011,7 +1011,7 @@ static void qlcnic_handle_fw_message(int desc_cnt, int index,
} }
break; break;
case QLCNIC_C2H_OPCODE_GET_DCB_AEN: case QLCNIC_C2H_OPCODE_GET_DCB_AEN:
qlcnic_dcb_handle_aen(adapter, (void *)&msg); qlcnic_dcb_aen_handler(adapter->dcb, (void *)&msg);
break; break;
default: default:
break; break;
......
...@@ -2071,7 +2071,7 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev, ...@@ -2071,7 +2071,7 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
return err; return err;
} }
qlcnic_dcb_init_dcbnl_ops(adapter); qlcnic_dcb_init_dcbnl_ops(adapter->dcb);
return 0; return 0;
} }
...@@ -2166,17 +2166,6 @@ void qlcnic_set_drv_version(struct qlcnic_adapter *adapter) ...@@ -2166,17 +2166,6 @@ void qlcnic_set_drv_version(struct qlcnic_adapter *adapter)
qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd); qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd);
} }
static int qlcnic_register_dcb(struct qlcnic_adapter *adapter)
{
return __qlcnic_register_dcb(adapter);
}
void qlcnic_clear_dcb_ops(struct qlcnic_adapter *adapter)
{
kfree(adapter->dcb);
adapter->dcb = NULL;
}
static int static int
qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
...@@ -2185,6 +2174,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2185,6 +2174,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
struct qlcnic_hardware_context *ahw; struct qlcnic_hardware_context *ahw;
int err, pci_using_dac = -1; int err, pci_using_dac = -1;
char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */ char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */
struct qlcnic_dcb *dcb;
if (pdev->is_virtfn) if (pdev->is_virtfn)
return -ENODEV; return -ENODEV;
...@@ -2305,8 +2295,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2305,8 +2295,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
adapter->flags |= QLCNIC_NEED_FLR; adapter->flags |= QLCNIC_NEED_FLR;
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);
} else if (qlcnic_83xx_check(adapter)) { } else if (qlcnic_83xx_check(adapter)) {
adapter->max_drv_tx_rings = 1; adapter->max_drv_tx_rings = 1;
...@@ -2451,7 +2443,7 @@ static void qlcnic_remove(struct pci_dev *pdev) ...@@ -2451,7 +2443,7 @@ static void qlcnic_remove(struct pci_dev *pdev)
qlcnic_cancel_idc_work(adapter); qlcnic_cancel_idc_work(adapter);
ahw = adapter->ahw; ahw = adapter->ahw;
qlcnic_dcb_free(adapter); qlcnic_dcb_free(adapter->dcb);
unregister_netdev(netdev); unregister_netdev(netdev);
qlcnic_sriov_cleanup(adapter); qlcnic_sriov_cleanup(adapter);
...@@ -3329,7 +3321,7 @@ qlcnic_attach_work(struct work_struct *work) ...@@ -3329,7 +3321,7 @@ qlcnic_attach_work(struct work_struct *work)
return; return;
} }
attach: attach:
qlcnic_dcb_get_info(adapter); qlcnic_dcb_get_info(adapter->dcb);
if (netif_running(netdev)) { if (netif_running(netdev)) {
if (qlcnic_up(adapter, netdev)) if (qlcnic_up(adapter, netdev))
......
...@@ -500,6 +500,7 @@ static int qlcnic_sriov_vf_init_driver(struct qlcnic_adapter *adapter) ...@@ -500,6 +500,7 @@ static int qlcnic_sriov_vf_init_driver(struct qlcnic_adapter *adapter)
static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter,
int pci_using_dac) int pci_using_dac)
{ {
struct qlcnic_dcb *dcb;
int err; int err;
INIT_LIST_HEAD(&adapter->vf_mc_list); INIT_LIST_HEAD(&adapter->vf_mc_list);
...@@ -533,8 +534,10 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, ...@@ -533,8 +534,10 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter,
if (err) if (err)
goto err_out_send_channel_term; goto err_out_send_channel_term;
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);
err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac); err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac);
if (err) if (err)
...@@ -1577,7 +1580,7 @@ static int qlcnic_sriov_vf_reinit_driver(struct qlcnic_adapter *adapter) ...@@ -1577,7 +1580,7 @@ static int qlcnic_sriov_vf_reinit_driver(struct qlcnic_adapter *adapter)
if (err) if (err)
goto err_out_term_channel; goto err_out_term_channel;
qlcnic_dcb_get_info(adapter); qlcnic_dcb_get_info(adapter->dcb);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment