Search Linux Wireless

Re: [PATCH 11/13] wcn36xx: Do not suspend if scan in progress

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 12/28/20 8:28 AM, Bryan O'Donoghue wrote:
If a scan is in progress do not attempt to enter into suspend. Allow the
scan process to quiesce before proceeding.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@xxxxxxxxxx>
---
  drivers/net/wireless/ath/wcn36xx/main.c    |  5 +++++
  drivers/net/wireless/ath/wcn36xx/smd.c     | 13 +++++++++++++
  drivers/net/wireless/ath/wcn36xx/smd.h     |  2 ++
  drivers/net/wireless/ath/wcn36xx/wcn36xx.h |  1 +
  4 files changed, 21 insertions(+)

diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index b48a3f0dcc0b..feb909192c8e 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -1113,6 +1113,11 @@ static int wcn36xx_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wow)
wcn36xx_dbg(WCN36XX_DBG_MAC, "mac suspend\n"); + if (wcn36xx_smd_is_scanning(wcn)) {
+		ret = -EBUSY;
+		goto out;
+	}
+

Should just be a return, since we haven't locked conf_mutex yet?

  	mutex_lock(&wcn->conf_mutex);
  	vif = wcn36xx_get_first_vif(wcn);
  	if (vif) {
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index dd12575f33c3..378282a93aa0 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -731,6 +731,7 @@ int wcn36xx_smd_init_scan(struct wcn36xx *wcn, enum wcn36xx_hal_sys_mode mode,
  		wcn36xx_err("hal_init_scan response failed err=%d\n", ret);
  		goto out;
  	}
+	wcn->scanning = true;
  out:
  	mutex_unlock(&wcn->hal_mutex);
  	return ret;
@@ -807,6 +808,7 @@ int wcn36xx_smd_finish_scan(struct wcn36xx *wcn,
  	mutex_lock(&wcn->hal_mutex);
  	INIT_HAL_MSG(msg_body, WCN36XX_HAL_FINISH_SCAN_REQ);
+ wcn->scanning = false;
  	msg_body.mode = mode;
  	msg_body.oper_channel = WCN36XX_HW_CHANNEL(wcn);
  	if (vif_priv->bss_index != WCN36XX_HAL_BSS_INVALID_IDX) {
@@ -938,6 +940,17 @@ int wcn36xx_smd_stop_hw_scan(struct wcn36xx *wcn)
  	return ret;
  }
+bool wcn36xx_smd_is_scanning(struct wcn36xx *wcn)
+{
+	bool scanning;
+
+	mutex_lock(&wcn->hal_mutex);
+	scanning = wcn->scanning;
+	mutex_unlock(&wcn->hal_mutex);
+
+	return scanning;
+}
+
  static int wcn36xx_smd_switch_channel_rsp(void *buf, size_t len)
  {
  	struct wcn36xx_hal_switch_channel_rsp_msg *rsp;
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.h b/drivers/net/wireless/ath/wcn36xx/smd.h
index b225c805107c..3488abb201d0 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.h
+++ b/drivers/net/wireless/ath/wcn36xx/smd.h
@@ -159,4 +159,6 @@ int wcn36xx_smd_gtk_offload(struct wcn36xx *wcn, struct ieee80211_vif *vif,
  int wcn36xx_smd_gtk_offload_get_info(struct wcn36xx *wcn,
  				     struct ieee80211_vif *vif);
+bool wcn36xx_smd_is_scanning(struct wcn36xx *wcn);
+
  #endif	/* _SMD_H_ */
diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
index 6121d8a5641a..36ea768a5203 100644
--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
+++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
@@ -249,6 +249,7 @@ struct wcn36xx {
  	struct ieee80211_vif	*sw_scan_vif;
  	struct mutex		scan_lock;
  	bool			scan_aborted;
+	bool			scanning;
/* DXE channels */
  	struct wcn36xx_dxe_ch	dxe_tx_l_ch;	/* TX low */




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux