Handle few corner cases in firmware hang detection and recovery:
o Don't mark device state as READY, till handshake with
firmware is done.
o During probe, if start_firmware fails, restore reference
count.
o Don't increment refernce count, if start_firmware fails
during firmware reset.
o Clear __NX_RESETTING bit, incase of fatal error or tempeature
reaches critical limit so that pci remove() doesn't poll on
this bit.
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
if (err < 0)
goto err_out;
if (err == 0)
if (err < 0)
goto err_out;
if (err == 0)
if (first_boot != 0x55555555) {
NXWR32(adapter, CRB_CMDPEG_STATE, 0);
if (first_boot != 0x55555555) {
NXWR32(adapter, CRB_CMDPEG_STATE, 0);
| (_NETXEN_NIC_LINUX_SUBVERSION);
NXWR32(adapter, CRB_DRIVER_VERSION, val);
| (_NETXEN_NIC_LINUX_SUBVERSION);
NXWR32(adapter, CRB_DRIVER_VERSION, val);
-ready:
- NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_READY);
-
wait_init:
/* Handshake with the card before we register the devices. */
err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
wait_init:
/* Handshake with the card before we register the devices. */
err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
+ NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_READY);
+
nx_update_dma_mask(adapter);
netxen_check_options(adapter);
nx_update_dma_mask(adapter);
netxen_check_options(adapter);
err = netxen_start_firmware(adapter);
if (err)
err = netxen_start_firmware(adapter);
if (err)
/*
* See if the firmware gave us a virtual-physical port mapping.
/*
* See if the firmware gave us a virtual-physical port mapping.
netxen_free_dummy_dma(adapter);
netxen_free_dummy_dma(adapter);
nx_decr_dev_ref_cnt(adapter);
err_out_iounmap:
nx_decr_dev_ref_cnt(adapter);
err_out_iounmap:
netxen_fwinit_work, 2 * FW_POLL_DELAY);
return;
}
netxen_fwinit_work, 2 * FW_POLL_DELAY);
return;
}
case NX_DEV_FAILED:
default:
case NX_DEV_FAILED:
default:
+ nx_incr_dev_ref_cnt(adapter);
- nx_incr_dev_ref_cnt(adapter);
clear_bit(__NX_RESETTING, &adapter->state);
}
clear_bit(__NX_RESETTING, &adapter->state);
}
status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1);
status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1);
- ref_cnt = nx_decr_dev_ref_cnt(adapter);
-
if (status & NX_RCODE_FATAL_ERROR)
if (status & NX_RCODE_FATAL_ERROR)
if (adapter->temp == NX_TEMP_PANIC)
if (adapter->temp == NX_TEMP_PANIC)
+ goto err_ret;
+
+ ref_cnt = nx_decr_dev_ref_cnt(adapter);
delay = (ref_cnt == 0) ? 0 : (2 * FW_POLL_DELAY);
adapter->fw_wait_cnt = 0;
netxen_schedule_work(adapter, netxen_fwinit_work, delay);
delay = (ref_cnt == 0) ? 0 : (2 * FW_POLL_DELAY);
adapter->fw_wait_cnt = 0;
netxen_schedule_work(adapter, netxen_fwinit_work, delay);
+
+ return;
+
+err_ret:
+ clear_bit(__NX_RESETTING, &adapter->state);