diff options
author | Bryan O'Donoghue <bryan.odonoghue@linaro.org> | 2020-10-23 16:15:00 +0100 |
---|---|---|
committer | Bryan O'Donoghue <bryan.odonoghue@linaro.org> | 2020-10-28 12:40:25 +0000 |
commit | a182fcfd13d9642aee85a079f8b0d23500c9e255 (patch) | |
tree | 9e6c4a1e0d8061b2c47d5c3d65343512b656359b | |
parent | 60959ddd04083b22232021255f9b7d0ec40bf35e (diff) |
ANDROID: wcn36xx: Keep system awake to process deauth framelinaro-m5.1-2020_10_28
If we receive a deauth frame in suspend for any reason, we need to ensure
that we keep the system awake long enough to actually register the change
and give user-space a chance to process it.
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
-rw-r--r-- | drivers/net/wireless/ath/wcn36xx/main.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ath/wcn36xx/txrx.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 |
3 files changed, 14 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c index 1347f85f8f03..0b9980751e6e 100644 --- a/drivers/net/wireless/ath/wcn36xx/main.c +++ b/drivers/net/wireless/ath/wcn36xx/main.c @@ -335,6 +335,8 @@ static int wcn36xx_start(struct ieee80211_hw *hw) INIT_LIST_HEAD(&wcn->vif_list); spin_lock_init(&wcn->dxe_lock); + wakeup_source_init(&wcn->ws, "wcn36xx_wakelock"); + return 0; out_smd_stop: @@ -368,6 +370,7 @@ static void wcn36xx_stop(struct ieee80211_hw *hw) wcn->scan_req = NULL; mutex_unlock(&wcn->scan_lock); + wakeup_source_trash(&wcn->ws); wcn36xx_debugfs_exit(wcn); wcn36xx_smd_stop(wcn); wcn36xx_dxe_deinit(wcn); diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c index 4d8fdd2c4589..6540c7799a4a 100644 --- a/drivers/net/wireless/ath/wcn36xx/txrx.c +++ b/drivers/net/wireless/ath/wcn36xx/txrx.c @@ -301,6 +301,16 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) (char *)skb->data, skb->len); } + /* + * If we are in suspend and receive a deauth frame keep the system + * stay awake long enough for user-space to run and realize it + * should re-authenticate. + * Give 10 seconds for user-space to latch and act on this + * in the suspend path. + */ + if (ieee80211_is_deauth(hdr->frame_control)) + pm_wakeup_ws_event(&wcn->ws, 10000, true); + ieee80211_rx_irqsafe(wcn->hw, skb); return 0; diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h index 6d70e2f3c587..3afcd190df02 100644 --- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h @@ -275,6 +275,7 @@ struct wcn36xx { struct wcn36xx_dfs_entry dfs; #endif /* CONFIG_WCN36XX_DEBUGFS */ + struct wakeup_source ws; }; static inline bool wcn36xx_is_fw_version(struct wcn36xx *wcn, |