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>
This commit is contained in:
parent
b4f1b177be
commit
4636187da6
6 changed files with 24 additions and 0 deletions
|
@ -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)
|
||||||
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)
|
||||||
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 @@ process_start:
|
||||||
(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 @@ process_start:
|
||||||
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 {
|
||||||
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)
|
||||||
* 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)
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
/* 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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue