mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
qlcnic: fix chip reset logic
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>
This commit is contained in:
parent
41c2178adc
commit
7b749ff4df
@ -2811,6 +2811,7 @@ qlcnic_fwinit_work(struct work_struct *work)
|
|||||||
struct qlcnic_adapter *adapter = container_of(work,
|
struct qlcnic_adapter *adapter = container_of(work,
|
||||||
struct qlcnic_adapter, fw_work.work);
|
struct qlcnic_adapter, fw_work.work);
|
||||||
u32 dev_state = 0xf;
|
u32 dev_state = 0xf;
|
||||||
|
u32 val;
|
||||||
|
|
||||||
if (qlcnic_api_lock(adapter))
|
if (qlcnic_api_lock(adapter))
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
@ -2837,11 +2838,6 @@ qlcnic_fwinit_work(struct work_struct *work)
|
|||||||
|
|
||||||
if (!qlcnic_check_drv_state(adapter)) {
|
if (!qlcnic_check_drv_state(adapter)) {
|
||||||
skip_ack_check:
|
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);
|
dev_state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
|
||||||
|
|
||||||
if (dev_state == QLCNIC_DEV_NEED_RESET) {
|
if (dev_state == QLCNIC_DEV_NEED_RESET) {
|
||||||
@ -2850,17 +2846,22 @@ skip_ack_check:
|
|||||||
set_bit(__QLCNIC_START_FW, &adapter->state);
|
set_bit(__QLCNIC_START_FW, &adapter->state);
|
||||||
QLCDB(adapter, DRV, "Restarting fw\n");
|
QLCDB(adapter, DRV, "Restarting fw\n");
|
||||||
qlcnic_idc_debug_info(adapter, 0);
|
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);
|
qlcnic_api_unlock(adapter);
|
||||||
|
|
||||||
rtnl_lock();
|
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");
|
QLCDB(adapter, DRV, "Take FW dump\n");
|
||||||
qlcnic_dump_fw(adapter);
|
qlcnic_dump_fw(adapter);
|
||||||
adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
|
|
||||||
}
|
}
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
|
|
||||||
|
adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
|
||||||
if (!adapter->nic_ops->start_firmware(adapter)) {
|
if (!adapter->nic_ops->start_firmware(adapter)) {
|
||||||
qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
|
qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
|
||||||
adapter->fw_wait_cnt = 0;
|
adapter->fw_wait_cnt = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user