diff options
author | Sritej Velaga <sritej.velaga@qlogic.com> | 2011-07-29 09:30:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-08-01 03:12:00 -0400 |
commit | 032a13c7d70f3f40877b298e4c62469980f27a1f (patch) | |
tree | 978285a52c0bc10207ede3da5d0d9fd2833822a3 | |
parent | 3d46512c642248fcb33f3b3ee2b2a80e2b09cd9c (diff) |
qlcnic: Fix delay in reset path
Driver should not check for heart beat anymore when FW is hung, rather it
should restart the FW.
Signed-off-by: Sritej Velaga <sritej.velaga@qlogic.com>
Signed-off-by: Anirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/qlcnic/qlcnic.h | 1 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_init.c | 3 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 5 |
3 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h index 4200ef81ca8e..5f0141be8ca9 100644 --- a/drivers/net/qlcnic/qlcnic.h +++ b/drivers/net/qlcnic/qlcnic.h | |||
@@ -911,6 +911,7 @@ struct qlcnic_ipaddr { | |||
911 | #define QLCNIC_PROMISC_DISABLED 0x800 | 911 | #define QLCNIC_PROMISC_DISABLED 0x800 |
912 | #define QLCNIC_NEED_FLR 0x1000 | 912 | #define QLCNIC_NEED_FLR 0x1000 |
913 | #define QLCNIC_FW_RESET_OWNER 0x2000 | 913 | #define QLCNIC_FW_RESET_OWNER 0x2000 |
914 | #define QLCNIC_FW_HANG 0x4000 | ||
914 | #define QLCNIC_IS_MSI_FAMILY(adapter) \ | 915 | #define QLCNIC_IS_MSI_FAMILY(adapter) \ |
915 | ((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED)) | 916 | ((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED)) |
916 | 917 | ||
diff --git a/drivers/net/qlcnic/qlcnic_init.c b/drivers/net/qlcnic/qlcnic_init.c index ee8a3982395e..3b6741e4754d 100644 --- a/drivers/net/qlcnic/qlcnic_init.c +++ b/drivers/net/qlcnic/qlcnic_init.c | |||
@@ -1056,7 +1056,8 @@ qlcnic_check_fw_hearbeat(struct qlcnic_adapter *adapter) | |||
1056 | int | 1056 | int |
1057 | qlcnic_need_fw_reset(struct qlcnic_adapter *adapter) | 1057 | qlcnic_need_fw_reset(struct qlcnic_adapter *adapter) |
1058 | { | 1058 | { |
1059 | if (qlcnic_check_fw_hearbeat(adapter)) { | 1059 | if ((adapter->flags & QLCNIC_FW_HANG) || |
1060 | qlcnic_check_fw_hearbeat(adapter)) { | ||
1060 | qlcnic_rom_lock_recovery(adapter); | 1061 | qlcnic_rom_lock_recovery(adapter); |
1061 | return 1; | 1062 | return 1; |
1062 | } | 1063 | } |
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 5ca1b562443c..248ebbd43279 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -2682,6 +2682,7 @@ qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed) | |||
2682 | qlcnic_api_unlock(adapter); | 2682 | qlcnic_api_unlock(adapter); |
2683 | err: | 2683 | err: |
2684 | adapter->fw_fail_cnt = 0; | 2684 | adapter->fw_fail_cnt = 0; |
2685 | adapter->flags &= ~QLCNIC_FW_HANG; | ||
2685 | clear_bit(__QLCNIC_START_FW, &adapter->state); | 2686 | clear_bit(__QLCNIC_START_FW, &adapter->state); |
2686 | clear_bit(__QLCNIC_RESETTING, &adapter->state); | 2687 | clear_bit(__QLCNIC_RESETTING, &adapter->state); |
2687 | } | 2688 | } |
@@ -2859,6 +2860,7 @@ skip_ack_check: | |||
2859 | (adapter->flags & QLCNIC_FW_RESET_OWNER)) { | 2860 | (adapter->flags & QLCNIC_FW_RESET_OWNER)) { |
2860 | QLCDB(adapter, DRV, "Take FW dump\n"); | 2861 | QLCDB(adapter, DRV, "Take FW dump\n"); |
2861 | qlcnic_dump_fw(adapter); | 2862 | qlcnic_dump_fw(adapter); |
2863 | adapter->flags |= QLCNIC_FW_HANG; | ||
2862 | } | 2864 | } |
2863 | rtnl_unlock(); | 2865 | rtnl_unlock(); |
2864 | 2866 | ||
@@ -3046,6 +3048,7 @@ attach: | |||
3046 | done: | 3048 | done: |
3047 | netif_device_attach(netdev); | 3049 | netif_device_attach(netdev); |
3048 | adapter->fw_fail_cnt = 0; | 3050 | adapter->fw_fail_cnt = 0; |
3051 | adapter->flags &= ~QLCNIC_FW_HANG; | ||
3049 | clear_bit(__QLCNIC_RESETTING, &adapter->state); | 3052 | clear_bit(__QLCNIC_RESETTING, &adapter->state); |
3050 | 3053 | ||
3051 | if (!qlcnic_clr_drv_state(adapter)) | 3054 | if (!qlcnic_clr_drv_state(adapter)) |
@@ -3090,6 +3093,8 @@ qlcnic_check_health(struct qlcnic_adapter *adapter) | |||
3090 | if (++adapter->fw_fail_cnt < FW_FAIL_THRESH) | 3093 | if (++adapter->fw_fail_cnt < FW_FAIL_THRESH) |
3091 | return 0; | 3094 | return 0; |
3092 | 3095 | ||
3096 | adapter->flags |= QLCNIC_FW_HANG; | ||
3097 | |||
3093 | qlcnic_dev_request_reset(adapter); | 3098 | qlcnic_dev_request_reset(adapter); |
3094 | 3099 | ||
3095 | if (auto_fw_reset) | 3100 | if (auto_fw_reset) |