Merge branch 'qlcnic'
Shahed Shaikh says: ==================== qlcnic: Bug fixes This patch series contains following bug fixes - * Send INIT_NIC_FUNC mailbox command as first mailbox * Fix a panic because of uninitialized delayed_work. * Fix inconsistent calculation of max rings count. * Fix PVID configuration issue. Driver needs to clear older PVID before adding new one. * Fix QLogic application/driver interface by packing vNIC information array. * Fix a crash when user tries to disable SR-IOV while VFs are still assigned to VMs. Please apply to net. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
14ed4a5bcb
|
@ -2139,8 +2139,6 @@ static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
|
|||
ahw->max_mac_filters = nic_info.max_mac_filters;
|
||||
ahw->max_mtu = nic_info.max_mtu;
|
||||
|
||||
adapter->max_tx_rings = ahw->max_tx_ques;
|
||||
adapter->max_sds_rings = ahw->max_rx_ques;
|
||||
/* eSwitch capability indicates vNIC mode.
|
||||
* vNIC and SRIOV are mutually exclusive operational modes.
|
||||
* If SR-IOV capability is detected, SR-IOV physical function
|
||||
|
@ -2161,6 +2159,7 @@ static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
|
|||
int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
||||
u16 max_sds_rings, max_tx_rings;
|
||||
int ret;
|
||||
|
||||
ret = qlcnic_83xx_get_nic_configuration(adapter);
|
||||
|
@ -2173,18 +2172,21 @@ int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
|
|||
if (qlcnic_83xx_config_vnic_opmode(adapter))
|
||||
return -EIO;
|
||||
|
||||
adapter->max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
|
||||
adapter->max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
|
||||
max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
|
||||
max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
|
||||
} else if (ret == QLC_83XX_DEFAULT_OPMODE) {
|
||||
ahw->nic_mode = QLCNIC_DEFAULT_MODE;
|
||||
adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
|
||||
ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
|
||||
adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
|
||||
adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS;
|
||||
max_sds_rings = QLCNIC_MAX_SDS_RINGS;
|
||||
max_tx_rings = QLCNIC_MAX_TX_RINGS;
|
||||
} else {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
adapter->max_sds_rings = min(ahw->max_rx_ques, max_sds_rings);
|
||||
adapter->max_tx_rings = min(ahw->max_tx_ques, max_tx_rings);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2348,15 +2350,16 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
|
|||
goto disable_intr;
|
||||
}
|
||||
|
||||
INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
|
||||
|
||||
err = qlcnic_83xx_setup_mbx_intr(adapter);
|
||||
if (err)
|
||||
goto disable_mbx_intr;
|
||||
|
||||
qlcnic_83xx_clear_function_resources(adapter);
|
||||
|
||||
INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
|
||||
|
||||
qlcnic_dcb_enable(adapter->dcb);
|
||||
qlcnic_83xx_initialize_nic(adapter, 1);
|
||||
qlcnic_dcb_get_info(adapter->dcb);
|
||||
|
||||
/* Configure default, SR-IOV or Virtual NIC mode of operation */
|
||||
err = qlcnic_83xx_configure_opmode(adapter);
|
||||
|
|
|
@ -883,8 +883,6 @@ int qlcnic_82xx_get_nic_info(struct qlcnic_adapter *adapter,
|
|||
npar_info->max_rx_ques = le16_to_cpu(nic_info->max_rx_ques);
|
||||
npar_info->capabilities = le32_to_cpu(nic_info->capabilities);
|
||||
npar_info->max_mtu = le16_to_cpu(nic_info->max_mtu);
|
||||
adapter->max_tx_rings = npar_info->max_tx_ques;
|
||||
adapter->max_sds_rings = npar_info->max_rx_ques;
|
||||
}
|
||||
|
||||
qlcnic_free_mbx_args(&cmd);
|
||||
|
@ -1356,6 +1354,7 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter,
|
|||
arg2 &= ~BIT_3;
|
||||
break;
|
||||
case QLCNIC_ADD_VLAN:
|
||||
arg1 &= ~(0x0ffff << 16);
|
||||
arg1 |= (BIT_2 | BIT_5);
|
||||
arg1 |= (esw_cfg->vlan_id << 16);
|
||||
break;
|
||||
|
|
|
@ -330,8 +330,6 @@ static int __qlcnic_dcb_attach(struct qlcnic_dcb *dcb)
|
|||
goto out_free_cfg;
|
||||
}
|
||||
|
||||
qlcnic_dcb_get_info(dcb);
|
||||
|
||||
return 0;
|
||||
out_free_cfg:
|
||||
kfree(dcb->cfg);
|
||||
|
|
|
@ -2528,8 +2528,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
goto err_out_free_hw;
|
||||
}
|
||||
|
||||
qlcnic_dcb_enable(adapter->dcb);
|
||||
|
||||
if (qlcnic_read_mac_addr(adapter))
|
||||
dev_warn(&pdev->dev, "failed to read mac addr\n");
|
||||
|
||||
|
@ -2549,7 +2547,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
"Device does not support MSI interrupts\n");
|
||||
|
||||
if (qlcnic_82xx_check(adapter)) {
|
||||
qlcnic_dcb_enable(adapter->dcb);
|
||||
qlcnic_dcb_get_info(adapter->dcb);
|
||||
err = qlcnic_setup_intr(adapter);
|
||||
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Failed to setup interrupt\n");
|
||||
goto err_out_disable_msi;
|
||||
|
|
|
@ -461,6 +461,16 @@ static int qlcnic_pci_sriov_disable(struct qlcnic_adapter *adapter)
|
|||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
|
||||
if (pci_vfs_assigned(adapter->pdev)) {
|
||||
netdev_err(adapter->netdev,
|
||||
"SR-IOV VFs belonging to port %d are assigned to VMs. SR-IOV can not be disabled on this port\n",
|
||||
adapter->portnum);
|
||||
netdev_info(adapter->netdev,
|
||||
"Please detach SR-IOV VFs belonging to port %d from VMs, and then try to disable SR-IOV on this port\n",
|
||||
adapter->portnum);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
if (netif_running(netdev))
|
||||
__qlcnic_down(adapter, netdev);
|
||||
|
|
|
@ -354,7 +354,7 @@ int qlcnic_is_valid_nic_func(struct qlcnic_adapter *adapter, u8 pci_func)
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < adapter->ahw->max_vnic_func; i++) {
|
||||
for (i = 0; i < adapter->ahw->total_nic_func; i++) {
|
||||
if (adapter->npars[i].pci_func == pci_func)
|
||||
return i;
|
||||
}
|
||||
|
@ -720,6 +720,7 @@ static ssize_t qlcnic_sysfs_read_npar_config(struct file *file,
|
|||
struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
|
||||
struct qlcnic_npar_func_cfg *np_cfg;
|
||||
struct qlcnic_info nic_info;
|
||||
u8 pci_func;
|
||||
int i, ret;
|
||||
u32 count;
|
||||
|
||||
|
@ -729,26 +730,28 @@ static ssize_t qlcnic_sysfs_read_npar_config(struct file *file,
|
|||
|
||||
count = size / sizeof(struct qlcnic_npar_func_cfg);
|
||||
for (i = 0; i < adapter->ahw->total_nic_func; i++) {
|
||||
if (qlcnic_is_valid_nic_func(adapter, i) < 0)
|
||||
continue;
|
||||
if (adapter->npars[i].pci_func >= count) {
|
||||
dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n",
|
||||
__func__, adapter->ahw->total_nic_func, count);
|
||||
continue;
|
||||
}
|
||||
ret = qlcnic_get_nic_info(adapter, &nic_info, i);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (!adapter->npars[i].eswitch_status)
|
||||
continue;
|
||||
np_cfg[i].pci_func = i;
|
||||
np_cfg[i].op_mode = (u8)nic_info.op_mode;
|
||||
np_cfg[i].port_num = nic_info.phys_port;
|
||||
np_cfg[i].fw_capab = nic_info.capabilities;
|
||||
np_cfg[i].min_bw = nic_info.min_tx_bw;
|
||||
np_cfg[i].max_bw = nic_info.max_tx_bw;
|
||||
np_cfg[i].max_tx_queues = nic_info.max_tx_ques;
|
||||
np_cfg[i].max_rx_queues = nic_info.max_rx_ques;
|
||||
pci_func = adapter->npars[i].pci_func;
|
||||
if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0)
|
||||
continue;
|
||||
ret = qlcnic_get_nic_info(adapter, &nic_info, pci_func);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
np_cfg[pci_func].pci_func = pci_func;
|
||||
np_cfg[pci_func].op_mode = (u8)nic_info.op_mode;
|
||||
np_cfg[pci_func].port_num = nic_info.phys_port;
|
||||
np_cfg[pci_func].fw_capab = nic_info.capabilities;
|
||||
np_cfg[pci_func].min_bw = nic_info.min_tx_bw;
|
||||
np_cfg[pci_func].max_bw = nic_info.max_tx_bw;
|
||||
np_cfg[pci_func].max_tx_queues = nic_info.max_tx_ques;
|
||||
np_cfg[pci_func].max_rx_queues = nic_info.max_rx_ques;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче