diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2010-02-01 05:24:56 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-02 23:55:44 (GMT) |
commit | 1b95a839587f40abab2f9cb3e5254dc821b9829b (patch) | |
tree | bade89b4209a5ae3c6fdb63cbeed13d08fc82fa1 | |
parent | 02420be6fc5fc63526aca43b5bfc571547a1c926 (diff) | |
download | linux-1b95a839587f40abab2f9cb3e5254dc821b9829b.tar.xz |
qlcnic: clear device reset state after fw recovery
o After firmware recovery, clear device reset state transition register.
Otherwise firmware reload can occur unnecessary.
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 05275f2..9a98285 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c @@ -1866,6 +1866,23 @@ qlcnic_set_drv_state(struct qlcnic_adapter *adapter, int state) qlcnic_api_unlock(adapter); } +static int +qlcnic_clr_drv_state(struct qlcnic_adapter *adapter) +{ + u32 val; + + if (qlcnic_api_lock(adapter)) + return -EBUSY; + + val = QLCRD32(adapter, QLCNIC_CRB_DRV_STATE); + val &= ~((u32)0x3 << (adapter->portnum * 4)); + QLCWR32(adapter, QLCNIC_CRB_DRV_STATE, val); + + qlcnic_api_unlock(adapter); + + return 0; +} + static void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter) { @@ -2119,7 +2136,10 @@ qlcnic_attach_work(struct work_struct *work) done: adapter->fw_fail_cnt = 0; clear_bit(__QLCNIC_RESETTING, &adapter->state); - qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY); + + if (!qlcnic_clr_drv_state(adapter)) + qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, + FW_POLL_DELAY); } static int |