mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-07 06:52:07 +00:00
qlcnic: Fix register device in FAILED state for 82xx.
o Commit7e2cf4feba
("qlcnic: change driver hardware interface mechanism") has overwritten commitb43e5ee76a
("qlcnic: Register device in FAILED state") Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a60b3a13ab
commit
6645161513
3 changed files with 57 additions and 2 deletions
|
@ -1794,3 +1794,11 @@ const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops = {
|
||||||
.set_msglevel = qlcnic_set_msglevel,
|
.set_msglevel = qlcnic_set_msglevel,
|
||||||
.get_msglevel = qlcnic_get_msglevel,
|
.get_msglevel = qlcnic_get_msglevel,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const struct ethtool_ops qlcnic_ethtool_failed_ops = {
|
||||||
|
.get_settings = qlcnic_get_settings,
|
||||||
|
.get_drvinfo = qlcnic_get_drvinfo,
|
||||||
|
.set_msglevel = qlcnic_set_msglevel,
|
||||||
|
.get_msglevel = qlcnic_get_msglevel,
|
||||||
|
.set_dump = qlcnic_set_dump,
|
||||||
|
};
|
||||||
|
|
|
@ -431,6 +431,9 @@ static void qlcnic_82xx_cancel_idc_work(struct qlcnic_adapter *adapter)
|
||||||
while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
|
while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
|
||||||
usleep_range(10000, 11000);
|
usleep_range(10000, 11000);
|
||||||
|
|
||||||
|
if (!adapter->fw_work.work.func)
|
||||||
|
return;
|
||||||
|
|
||||||
cancel_delayed_work_sync(&adapter->fw_work);
|
cancel_delayed_work_sync(&adapter->fw_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2275,8 +2278,9 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
adapter->portnum = adapter->ahw->pci_func;
|
adapter->portnum = adapter->ahw->pci_func;
|
||||||
err = qlcnic_start_firmware(adapter);
|
err = qlcnic_start_firmware(adapter);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&pdev->dev, "Loading fw failed.Please Reboot\n");
|
dev_err(&pdev->dev, "Loading fw failed.Please Reboot\n"
|
||||||
goto err_out_free_hw;
|
"\t\tIf reboot doesn't help, try flashing the card\n");
|
||||||
|
goto err_out_maintenance_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
qlcnic_get_multiq_capability(adapter);
|
qlcnic_get_multiq_capability(adapter);
|
||||||
|
@ -2408,6 +2412,22 @@ err_out_disable_pdev:
|
||||||
pci_set_drvdata(pdev, NULL);
|
pci_set_drvdata(pdev, NULL);
|
||||||
pci_disable_device(pdev);
|
pci_disable_device(pdev);
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
err_out_maintenance_mode:
|
||||||
|
netdev->netdev_ops = &qlcnic_netdev_failed_ops;
|
||||||
|
SET_ETHTOOL_OPS(netdev, &qlcnic_ethtool_failed_ops);
|
||||||
|
err = register_netdev(netdev);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
dev_err(&pdev->dev, "Failed to register net device\n");
|
||||||
|
qlcnic_clr_all_drv_state(adapter, 0);
|
||||||
|
goto err_out_free_hw;
|
||||||
|
}
|
||||||
|
|
||||||
|
pci_set_drvdata(pdev, adapter);
|
||||||
|
qlcnic_add_sysfs(adapter);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qlcnic_remove(struct pci_dev *pdev)
|
static void qlcnic_remove(struct pci_dev *pdev)
|
||||||
|
@ -2518,8 +2538,16 @@ static int qlcnic_resume(struct pci_dev *pdev)
|
||||||
static int qlcnic_open(struct net_device *netdev)
|
static int qlcnic_open(struct net_device *netdev)
|
||||||
{
|
{
|
||||||
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
||||||
|
u32 state;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
|
||||||
|
if (state == QLCNIC_DEV_FAILED || state == QLCNIC_DEV_BADBAD) {
|
||||||
|
netdev_err(netdev, "%s: Device is in FAILED state\n", __func__);
|
||||||
|
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
|
|
||||||
err = qlcnic_attach(adapter);
|
err = qlcnic_attach(adapter);
|
||||||
|
@ -3228,6 +3256,13 @@ void qlcnic_82xx_dev_request_reset(struct qlcnic_adapter *adapter, u32 key)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
|
state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
|
||||||
|
if (state == QLCNIC_DEV_FAILED || state == QLCNIC_DEV_BADBAD) {
|
||||||
|
netdev_err(adapter->netdev, "%s: Device is in FAILED state\n",
|
||||||
|
__func__);
|
||||||
|
qlcnic_api_unlock(adapter);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (state == QLCNIC_DEV_READY) {
|
if (state == QLCNIC_DEV_READY) {
|
||||||
QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
|
QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
|
||||||
|
|
|
@ -1272,6 +1272,7 @@ void qlcnic_remove_sysfs_entries(struct qlcnic_adapter *adapter)
|
||||||
void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
|
void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct device *dev = &adapter->pdev->dev;
|
struct device *dev = &adapter->pdev->dev;
|
||||||
|
u32 state;
|
||||||
|
|
||||||
if (device_create_bin_file(dev, &bin_attr_port_stats))
|
if (device_create_bin_file(dev, &bin_attr_port_stats))
|
||||||
dev_info(dev, "failed to create port stats sysfs entry");
|
dev_info(dev, "failed to create port stats sysfs entry");
|
||||||
|
@ -1285,8 +1286,13 @@ void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
|
||||||
if (device_create_bin_file(dev, &bin_attr_mem))
|
if (device_create_bin_file(dev, &bin_attr_mem))
|
||||||
dev_info(dev, "failed to create mem sysfs entry\n");
|
dev_info(dev, "failed to create mem sysfs entry\n");
|
||||||
|
|
||||||
|
state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
|
||||||
|
if (state == QLCNIC_DEV_FAILED || state == QLCNIC_DEV_BADBAD)
|
||||||
|
return;
|
||||||
|
|
||||||
if (device_create_bin_file(dev, &bin_attr_pci_config))
|
if (device_create_bin_file(dev, &bin_attr_pci_config))
|
||||||
dev_info(dev, "failed to create pci config sysfs entry");
|
dev_info(dev, "failed to create pci config sysfs entry");
|
||||||
|
|
||||||
if (device_create_file(dev, &dev_attr_beacon))
|
if (device_create_file(dev, &dev_attr_beacon))
|
||||||
dev_info(dev, "failed to create beacon sysfs entry");
|
dev_info(dev, "failed to create beacon sysfs entry");
|
||||||
|
|
||||||
|
@ -1307,6 +1313,7 @@ void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
|
||||||
void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter)
|
void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct device *dev = &adapter->pdev->dev;
|
struct device *dev = &adapter->pdev->dev;
|
||||||
|
u32 state;
|
||||||
|
|
||||||
device_remove_bin_file(dev, &bin_attr_port_stats);
|
device_remove_bin_file(dev, &bin_attr_port_stats);
|
||||||
|
|
||||||
|
@ -1315,6 +1322,11 @@ void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter)
|
||||||
device_remove_file(dev, &dev_attr_diag_mode);
|
device_remove_file(dev, &dev_attr_diag_mode);
|
||||||
device_remove_bin_file(dev, &bin_attr_crb);
|
device_remove_bin_file(dev, &bin_attr_crb);
|
||||||
device_remove_bin_file(dev, &bin_attr_mem);
|
device_remove_bin_file(dev, &bin_attr_mem);
|
||||||
|
|
||||||
|
state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
|
||||||
|
if (state == QLCNIC_DEV_FAILED || state == QLCNIC_DEV_BADBAD)
|
||||||
|
return;
|
||||||
|
|
||||||
device_remove_bin_file(dev, &bin_attr_pci_config);
|
device_remove_bin_file(dev, &bin_attr_pci_config);
|
||||||
device_remove_file(dev, &dev_attr_beacon);
|
device_remove_file(dev, &dev_attr_beacon);
|
||||||
if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
|
if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue