Commit 4636187d authored by Amitkumar Karwar's avatar Amitkumar Karwar Committed by Kalle Valo

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: default avatarCathy Luo <cluo@marvell.com>
Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent b4f1b177
...@@ -52,6 +52,18 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv) ...@@ -52,6 +52,18 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv)
return 0; return 0;
} }
static void wakeup_timer_fn(unsigned long data)
{
struct mwifiex_adapter *adapter = (struct mwifiex_adapter *)data;
dev_err(adapter->dev, "Firmware wakeup failed\n");
adapter->hw_status = MWIFIEX_HW_STATUS_RESET;
mwifiex_cancel_all_pending_cmd(adapter);
if (adapter->if_ops.card_reset)
adapter->if_ops.card_reset(adapter);
}
/* /*
* This function initializes the private structure and sets default * This function initializes the private structure and sets default
* values to the members. * values to the members.
...@@ -285,6 +297,9 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter) ...@@ -285,6 +297,9 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
adapter->ext_scan = true; adapter->ext_scan = true;
adapter->key_api_major_ver = 0; adapter->key_api_major_ver = 0;
adapter->key_api_minor_ver = 0; adapter->key_api_minor_ver = 0;
setup_timer(&adapter->wakeup_timer, wakeup_timer_fn,
(unsigned long)adapter);
} }
/* /*
...@@ -391,6 +406,7 @@ mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter) ...@@ -391,6 +406,7 @@ mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter)
return; return;
} }
del_timer(&adapter->wakeup_timer);
mwifiex_cancel_all_pending_cmd(adapter); mwifiex_cancel_all_pending_cmd(adapter);
/* Free lock variables */ /* Free lock variables */
......
...@@ -237,6 +237,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) ...@@ -237,6 +237,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
(is_command_pending(adapter) || (is_command_pending(adapter) ||
!mwifiex_wmm_lists_empty(adapter))) { !mwifiex_wmm_lists_empty(adapter))) {
adapter->pm_wakeup_fw_try = true; adapter->pm_wakeup_fw_try = true;
mod_timer(&adapter->wakeup_timer, jiffies + (HZ*3));
adapter->if_ops.wakeup(adapter); adapter->if_ops.wakeup(adapter);
continue; continue;
} }
...@@ -244,6 +245,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) ...@@ -244,6 +245,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
if (IS_CARD_RX_RCVD(adapter)) { if (IS_CARD_RX_RCVD(adapter)) {
adapter->data_received = false; adapter->data_received = false;
adapter->pm_wakeup_fw_try = false; adapter->pm_wakeup_fw_try = false;
del_timer_sync(&adapter->wakeup_timer);
if (adapter->ps_state == PS_STATE_SLEEP) if (adapter->ps_state == PS_STATE_SLEEP)
adapter->ps_state = PS_STATE_AWAKE; adapter->ps_state = PS_STATE_AWAKE;
} else { } else {
......
...@@ -830,6 +830,7 @@ struct mwifiex_adapter { ...@@ -830,6 +830,7 @@ struct mwifiex_adapter {
u16 gen_null_pkt; u16 gen_null_pkt;
u16 pps_uapsd_mode; u16 pps_uapsd_mode;
u32 pm_wakeup_fw_try; u32 pm_wakeup_fw_try;
struct timer_list wakeup_timer;
u8 is_hs_configured; u8 is_hs_configured;
struct mwifiex_hs_config_param hs_cfg; struct mwifiex_hs_config_param hs_cfg;
u8 hs_activated; u8 hs_activated;
......
...@@ -2064,6 +2064,7 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter) ...@@ -2064,6 +2064,7 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
* state until cookie is set */ * state until cookie is set */
adapter->ps_state = PS_STATE_AWAKE; adapter->ps_state = PS_STATE_AWAKE;
adapter->pm_wakeup_fw_try = false; adapter->pm_wakeup_fw_try = false;
del_timer(&adapter->wakeup_timer);
} }
} }
} }
......
...@@ -312,6 +312,8 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) ...@@ -312,6 +312,8 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
adapter->ps_state = PS_STATE_AWAKE; adapter->ps_state = PS_STATE_AWAKE;
adapter->pm_wakeup_card_req = false; adapter->pm_wakeup_card_req = false;
adapter->pm_wakeup_fw_try = false; adapter->pm_wakeup_fw_try = false;
mod_timer(&adapter->wakeup_timer,
jiffies + (HZ*3));
break; break;
} }
if (!mwifiex_send_null_packet if (!mwifiex_send_null_packet
...@@ -326,6 +328,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) ...@@ -326,6 +328,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
adapter->ps_state = PS_STATE_AWAKE; adapter->ps_state = PS_STATE_AWAKE;
adapter->pm_wakeup_card_req = false; adapter->pm_wakeup_card_req = false;
adapter->pm_wakeup_fw_try = false; adapter->pm_wakeup_fw_try = false;
del_timer_sync(&adapter->wakeup_timer);
break; break;
......
...@@ -990,6 +990,7 @@ static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter) ...@@ -990,6 +990,7 @@ static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
{ {
/* Simulation of HS_AWAKE event */ /* Simulation of HS_AWAKE event */
adapter->pm_wakeup_fw_try = false; adapter->pm_wakeup_fw_try = false;
del_timer_sync(&adapter->wakeup_timer);
adapter->pm_wakeup_card_req = false; adapter->pm_wakeup_card_req = false;
adapter->ps_state = PS_STATE_AWAKE; adapter->ps_state = PS_STATE_AWAKE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment