aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>2020-10-23 16:15:00 +0100
committerBryan O'Donoghue <bryan.odonoghue@linaro.org>2020-10-28 12:22:23 +0000
commite6be9c3de851fffc71e1f708dca9e087ec40495e (patch)
tree13b838dd81241d1f575460d7da95e1ca958fe1c7
parentd15826f07d7ec220749a15279dc689c3b8644af1 (diff)
ANDROID: wcn36xx: Keep system awake to process deauth framelinaro-m5.1-squid-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.c3
-rw-r--r--drivers/net/wireless/ath/wcn36xx/txrx.c10
-rw-r--r--drivers/net/wireless/ath/wcn36xx/wcn36xx.h1
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,