diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2010-08-25 00:03:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-08-25 17:15:28 -0400 |
commit | b18971d199cf35f68ffa22e4be1c477493fdb7e1 (patch) | |
tree | 7a160fb7ecac543c0b4fc5ba7ef489130f08aa10 /drivers | |
parent | 8cf61f890ac4c2a15acb24658feba13c9c838b52 (diff) |
qlcnic: fix fw recovery for PF
Privilege function should wait for npar state to be operational
before creating context.
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 089212214ad4..26d9e10a36d5 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -997,11 +997,7 @@ check_fw_status: | |||
997 | set_dev_ready: | 997 | set_dev_ready: |
998 | QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY); | 998 | QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY); |
999 | qlcnic_idc_debug_info(adapter, 1); | 999 | qlcnic_idc_debug_info(adapter, 1); |
1000 | err = qlcnic_check_npar_opertional(adapter); | 1000 | |
1001 | if (err) { | ||
1002 | qlcnic_release_firmware(adapter); | ||
1003 | return err; | ||
1004 | } | ||
1005 | if (qlcnic_set_default_offload_settings(adapter)) | 1001 | if (qlcnic_set_default_offload_settings(adapter)) |
1006 | goto err_out; | 1002 | goto err_out; |
1007 | if (qlcnic_reset_npar_config(adapter)) | 1003 | if (qlcnic_reset_npar_config(adapter)) |
@@ -2602,6 +2598,7 @@ skip_ack_check: | |||
2602 | 2598 | ||
2603 | if (!adapter->nic_ops->start_firmware(adapter)) { | 2599 | if (!adapter->nic_ops->start_firmware(adapter)) { |
2604 | qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); | 2600 | qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); |
2601 | adapter->fw_wait_cnt = 0; | ||
2605 | return; | 2602 | return; |
2606 | } | 2603 | } |
2607 | goto err_ret; | 2604 | goto err_ret; |
@@ -2617,6 +2614,7 @@ wait_npar: | |||
2617 | case QLCNIC_DEV_READY: | 2614 | case QLCNIC_DEV_READY: |
2618 | if (!adapter->nic_ops->start_firmware(adapter)) { | 2615 | if (!adapter->nic_ops->start_firmware(adapter)) { |
2619 | qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); | 2616 | qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); |
2617 | adapter->fw_wait_cnt = 0; | ||
2620 | return; | 2618 | return; |
2621 | } | 2619 | } |
2622 | case QLCNIC_DEV_FAILED: | 2620 | case QLCNIC_DEV_FAILED: |
@@ -2750,7 +2748,21 @@ qlcnic_attach_work(struct work_struct *work) | |||
2750 | struct qlcnic_adapter *adapter = container_of(work, | 2748 | struct qlcnic_adapter *adapter = container_of(work, |
2751 | struct qlcnic_adapter, fw_work.work); | 2749 | struct qlcnic_adapter, fw_work.work); |
2752 | struct net_device *netdev = adapter->netdev; | 2750 | struct net_device *netdev = adapter->netdev; |
2751 | u32 npar_state; | ||
2753 | 2752 | ||
2753 | if (adapter->op_mode != QLCNIC_MGMT_FUNC) { | ||
2754 | npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE); | ||
2755 | if (adapter->fw_wait_cnt++ > QLCNIC_DEV_NPAR_OPER_TIMEO) | ||
2756 | qlcnic_clr_all_drv_state(adapter, 0); | ||
2757 | else if (npar_state != QLCNIC_DEV_NPAR_OPER) | ||
2758 | qlcnic_schedule_work(adapter, qlcnic_attach_work, | ||
2759 | FW_POLL_DELAY); | ||
2760 | else | ||
2761 | goto attach; | ||
2762 | QLCDB(adapter, DRV, "Waiting for NPAR state to operational\n"); | ||
2763 | return; | ||
2764 | } | ||
2765 | attach: | ||
2754 | if (netif_running(netdev)) { | 2766 | if (netif_running(netdev)) { |
2755 | if (qlcnic_up(adapter, netdev)) | 2767 | if (qlcnic_up(adapter, netdev)) |
2756 | goto done; | 2768 | goto done; |