diff options
author | Amitkumar Karwar <akarwar@marvell.com> | 2014-12-31 05:36:41 -0500 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2015-01-06 14:19:44 -0500 |
commit | 4636187da60b6e33526050235c610409d9cc00e8 (patch) | |
tree | e1bd810c8f421db9e787b2399f0288412bd92f6b | |
parent | b4f1b177be27103cd84a3692ae71bf857700e27f (diff) |
mwifiex: add wakeup timer based recovery mechanism
If host fails to wakeup the firmware, we will trigger card reset
after 3 second timeout.
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-rw-r--r-- | drivers/net/wireless/mwifiex/init.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/main.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/pcie.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/sta_event.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/usb.c | 1 |
6 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c index a3dd601a495a..524692a59d4a 100644 --- a/drivers/net/wireless/mwifiex/init.c +++ b/drivers/net/wireless/mwifiex/init.c | |||
@@ -52,6 +52,18 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv) | |||
52 | return 0; | 52 | return 0; |
53 | } | 53 | } |
54 | 54 | ||
55 | static void wakeup_timer_fn(unsigned long data) | ||
56 | { | ||
57 | struct mwifiex_adapter *adapter = (struct mwifiex_adapter *)data; | ||
58 | |||
59 | dev_err(adapter->dev, "Firmware wakeup failed\n"); | ||
60 | adapter->hw_status = MWIFIEX_HW_STATUS_RESET; | ||
61 | mwifiex_cancel_all_pending_cmd(adapter); | ||
62 | |||
63 | if (adapter->if_ops.card_reset) | ||
64 | adapter->if_ops.card_reset(adapter); | ||
65 | } | ||
66 | |||
55 | /* | 67 | /* |
56 | * This function initializes the private structure and sets default | 68 | * This function initializes the private structure and sets default |
57 | * values to the members. | 69 | * values to the members. |
@@ -285,6 +297,9 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter) | |||
285 | adapter->ext_scan = true; | 297 | adapter->ext_scan = true; |
286 | adapter->key_api_major_ver = 0; | 298 | adapter->key_api_major_ver = 0; |
287 | adapter->key_api_minor_ver = 0; | 299 | adapter->key_api_minor_ver = 0; |
300 | |||
301 | setup_timer(&adapter->wakeup_timer, wakeup_timer_fn, | ||
302 | (unsigned long)adapter); | ||
288 | } | 303 | } |
289 | 304 | ||
290 | /* | 305 | /* |
@@ -391,6 +406,7 @@ mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter) | |||
391 | return; | 406 | return; |
392 | } | 407 | } |
393 | 408 | ||
409 | del_timer(&adapter->wakeup_timer); | ||
394 | mwifiex_cancel_all_pending_cmd(adapter); | 410 | mwifiex_cancel_all_pending_cmd(adapter); |
395 | 411 | ||
396 | /* Free lock variables */ | 412 | /* Free lock variables */ |
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c index 2d4047f4be17..119e87574e83 100644 --- a/drivers/net/wireless/mwifiex/main.c +++ b/drivers/net/wireless/mwifiex/main.c | |||
@@ -237,6 +237,7 @@ process_start: | |||
237 | (is_command_pending(adapter) || | 237 | (is_command_pending(adapter) || |
238 | !mwifiex_wmm_lists_empty(adapter))) { | 238 | !mwifiex_wmm_lists_empty(adapter))) { |
239 | adapter->pm_wakeup_fw_try = true; | 239 | adapter->pm_wakeup_fw_try = true; |
240 | mod_timer(&adapter->wakeup_timer, jiffies + (HZ*3)); | ||
240 | adapter->if_ops.wakeup(adapter); | 241 | adapter->if_ops.wakeup(adapter); |
241 | continue; | 242 | continue; |
242 | } | 243 | } |
@@ -244,6 +245,7 @@ process_start: | |||
244 | if (IS_CARD_RX_RCVD(adapter)) { | 245 | if (IS_CARD_RX_RCVD(adapter)) { |
245 | adapter->data_received = false; | 246 | adapter->data_received = false; |
246 | adapter->pm_wakeup_fw_try = false; | 247 | adapter->pm_wakeup_fw_try = false; |
248 | del_timer_sync(&adapter->wakeup_timer); | ||
247 | if (adapter->ps_state == PS_STATE_SLEEP) | 249 | if (adapter->ps_state == PS_STATE_SLEEP) |
248 | adapter->ps_state = PS_STATE_AWAKE; | 250 | adapter->ps_state = PS_STATE_AWAKE; |
249 | } else { | 251 | } else { |
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h index f9279399226a..55273eefb785 100644 --- a/drivers/net/wireless/mwifiex/main.h +++ b/drivers/net/wireless/mwifiex/main.h | |||
@@ -830,6 +830,7 @@ struct mwifiex_adapter { | |||
830 | u16 gen_null_pkt; | 830 | u16 gen_null_pkt; |
831 | u16 pps_uapsd_mode; | 831 | u16 pps_uapsd_mode; |
832 | u32 pm_wakeup_fw_try; | 832 | u32 pm_wakeup_fw_try; |
833 | struct timer_list wakeup_timer; | ||
833 | u8 is_hs_configured; | 834 | u8 is_hs_configured; |
834 | struct mwifiex_hs_config_param hs_cfg; | 835 | struct mwifiex_hs_config_param hs_cfg; |
835 | u8 hs_activated; | 836 | u8 hs_activated; |
diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c index c3a20f94f3c9..10e4a93d3d56 100644 --- a/drivers/net/wireless/mwifiex/pcie.c +++ b/drivers/net/wireless/mwifiex/pcie.c | |||
@@ -2064,6 +2064,7 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter) | |||
2064 | * state until cookie is set */ | 2064 | * state until cookie is set */ |
2065 | adapter->ps_state = PS_STATE_AWAKE; | 2065 | adapter->ps_state = PS_STATE_AWAKE; |
2066 | adapter->pm_wakeup_fw_try = false; | 2066 | adapter->pm_wakeup_fw_try = false; |
2067 | del_timer(&adapter->wakeup_timer); | ||
2067 | } | 2068 | } |
2068 | } | 2069 | } |
2069 | } | 2070 | } |
diff --git a/drivers/net/wireless/mwifiex/sta_event.c b/drivers/net/wireless/mwifiex/sta_event.c index fbec95bbc10f..419e35f1dbf3 100644 --- a/drivers/net/wireless/mwifiex/sta_event.c +++ b/drivers/net/wireless/mwifiex/sta_event.c | |||
@@ -312,6 +312,8 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) | |||
312 | adapter->ps_state = PS_STATE_AWAKE; | 312 | adapter->ps_state = PS_STATE_AWAKE; |
313 | adapter->pm_wakeup_card_req = false; | 313 | adapter->pm_wakeup_card_req = false; |
314 | adapter->pm_wakeup_fw_try = false; | 314 | adapter->pm_wakeup_fw_try = false; |
315 | mod_timer(&adapter->wakeup_timer, | ||
316 | jiffies + (HZ*3)); | ||
315 | break; | 317 | break; |
316 | } | 318 | } |
317 | if (!mwifiex_send_null_packet | 319 | if (!mwifiex_send_null_packet |
@@ -326,6 +328,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) | |||
326 | adapter->ps_state = PS_STATE_AWAKE; | 328 | adapter->ps_state = PS_STATE_AWAKE; |
327 | adapter->pm_wakeup_card_req = false; | 329 | adapter->pm_wakeup_card_req = false; |
328 | adapter->pm_wakeup_fw_try = false; | 330 | adapter->pm_wakeup_fw_try = false; |
331 | del_timer_sync(&adapter->wakeup_timer); | ||
329 | 332 | ||
330 | break; | 333 | break; |
331 | 334 | ||
diff --git a/drivers/net/wireless/mwifiex/usb.c b/drivers/net/wireless/mwifiex/usb.c index 8ae7a8586811..199b43f89e01 100644 --- a/drivers/net/wireless/mwifiex/usb.c +++ b/drivers/net/wireless/mwifiex/usb.c | |||
@@ -990,6 +990,7 @@ static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter) | |||
990 | { | 990 | { |
991 | /* Simulation of HS_AWAKE event */ | 991 | /* Simulation of HS_AWAKE event */ |
992 | adapter->pm_wakeup_fw_try = false; | 992 | adapter->pm_wakeup_fw_try = false; |
993 | del_timer_sync(&adapter->wakeup_timer); | ||
993 | adapter->pm_wakeup_card_req = false; | 994 | adapter->pm_wakeup_card_req = false; |
994 | adapter->ps_state = PS_STATE_AWAKE; | 995 | adapter->ps_state = PS_STATE_AWAKE; |
995 | 996 | ||