aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmitkumar Karwar <akarwar@marvell.com>2014-12-31 05:36:41 -0500
committerKalle Valo <kvalo@codeaurora.org>2015-01-06 14:19:44 -0500
commit4636187da60b6e33526050235c610409d9cc00e8 (patch)
treee1bd810c8f421db9e787b2399f0288412bd92f6b
parentb4f1b177be27103cd84a3692ae71bf857700e27f (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.c16
-rw-r--r--drivers/net/wireless/mwifiex/main.c2
-rw-r--r--drivers/net/wireless/mwifiex/main.h1
-rw-r--r--drivers/net/wireless/mwifiex/pcie.c1
-rw-r--r--drivers/net/wireless/mwifiex/sta_event.c3
-rw-r--r--drivers/net/wireless/mwifiex/usb.c1
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
55static 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