qlcnic: fix chip reset logic
authorSritej Velaga <sritej.velaga@qlogic.com>
Thu, 14 Jul 2011 03:16:50 +0000 (03:16 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 14 Jul 2011 15:49:44 +0000 (08:49 -0700)
Chip reset logic (IDC logic) has changed with fw dump support.
This broked compatibility with driver using older IDC logic.
Changes to make it compatible with drivers using older IDC logic.

Signed-off-by: Sritej Velaga <sritej.velaga@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlcnic/qlcnic_main.c

index 357436be801e68c023bf2b8a7fedce81e4b44f50..6b646c65f2fd9ddf56a9ff8a9e56d7d66fea015a 100644 (file)
@@ -2811,6 +2811,7 @@ qlcnic_fwinit_work(struct work_struct *work)
        struct qlcnic_adapter *adapter = container_of(work,
                        struct qlcnic_adapter, fw_work.work);
        u32 dev_state = 0xf;
+       u32 val;
 
        if (qlcnic_api_lock(adapter))
                goto err_ret;
@@ -2837,11 +2838,6 @@ qlcnic_fwinit_work(struct work_struct *work)
 
        if (!qlcnic_check_drv_state(adapter)) {
 skip_ack_check:
-               if (!(adapter->flags & QLCNIC_FW_RESET_OWNER)) {
-                       qlcnic_api_unlock(adapter);
-                       goto wait_npar;
-               }
-
                dev_state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
 
                if (dev_state == QLCNIC_DEV_NEED_RESET) {
@@ -2850,17 +2846,22 @@ skip_ack_check:
                        set_bit(__QLCNIC_START_FW, &adapter->state);
                        QLCDB(adapter, DRV, "Restarting fw\n");
                        qlcnic_idc_debug_info(adapter, 0);
+                       val = QLCRD32(adapter, QLCNIC_CRB_DRV_STATE);
+                       QLC_DEV_SET_RST_RDY(val, adapter->portnum);
+                       QLCWR32(adapter, QLCNIC_CRB_DRV_STATE, val);
                }
 
                qlcnic_api_unlock(adapter);
 
                rtnl_lock();
-               if (adapter->ahw->fw_dump.enable) {
+               if (adapter->ahw->fw_dump.enable &&
+                   (adapter->flags & QLCNIC_FW_RESET_OWNER)) {
                        QLCDB(adapter, DRV, "Take FW dump\n");
                        qlcnic_dump_fw(adapter);
-                       adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
                }
                rtnl_unlock();
+
+               adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
                if (!adapter->nic_ops->start_firmware(adapter)) {
                        qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
                        adapter->fw_wait_cnt = 0;