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;
 
        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) {
                        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;