diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2010-08-19 05:08:28 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-08-19 16:52:40 -0700 |
commit | 78f84e1a7028a77b72aebc769642a5e93d32b4f9 (patch) | |
tree | da78f8bcdac0d8cba74b0653a8184c992b16be86 /drivers/net | |
parent | fe4d434da8e96142e36eb22fc5cf29ef2c2df9c2 (diff) |
qlcnic: fix npar state
Privilege functions should wait for npar state to be operational.
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index de4be00e31e5..6a8e9702c7b7 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c @@ -916,6 +916,27 @@ qlcnic_reset_npar_config(struct qlcnic_adapter *adapter) return 0; } +static int qlcnic_check_npar_opertional(struct qlcnic_adapter *adapter) +{ + u8 npar_opt_timeo = QLCNIC_DEV_NPAR_OPER_TIMEO; + u32 npar_state; + + if (adapter->op_mode == QLCNIC_MGMT_FUNC) + return 0; + + npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE); + while (npar_state != QLCNIC_DEV_NPAR_OPER && --npar_opt_timeo) { + msleep(1000); + npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE); + } + if (!npar_opt_timeo) { + dev_err(&adapter->pdev->dev, + "Waiting for NPAR state to opertional timeout\n"); + return -EIO; + } + return 0; +} + static int qlcnic_start_firmware(struct qlcnic_adapter *adapter) { @@ -978,6 +999,11 @@ wait_init: QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY); qlcnic_idc_debug_info(adapter, 1); + err = qlcnic_check_npar_opertional(adapter); + if (err) { + qlcnic_release_firmware(adapter); + return err; + } if (qlcnic_set_default_offload_settings(adapter)) goto err_out; if (qlcnic_reset_npar_config(adapter)) @@ -2919,29 +2945,18 @@ static void qlcnic_io_resume(struct pci_dev *pdev) FW_POLL_DELAY); } - static int qlcnicvf_start_firmware(struct qlcnic_adapter *adapter) { int err; - u8 npar_opt_timeo = QLCNIC_DEV_NPAR_OPER_TIMEO; - u32 npar_state; err = qlcnic_can_start_firmware(adapter); if (err) return err; - npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE); - while (npar_state != QLCNIC_DEV_NPAR_OPER && --npar_opt_timeo) { - msleep(1000); - npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE); - } - - if (!npar_opt_timeo) { - dev_err(&adapter->pdev->dev, - "Waiting for NPAR state to opertional timeout\n"); - return -EIO; - } + err = qlcnic_check_npar_opertional(adapter); + if (err) + return err; qlcnic_check_options(adapter); |