|
@@ -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;
|