diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c index 8d44e39052ec..8d8dc6fc10e8 100644 --- a/drivers/net/wireless/ath/wcn36xx/main.c +++ b/drivers/net/wireless/ath/wcn36xx/main.c @@ -28,7 +28,7 @@ #include "wcn36xx.h" #include "testmode.h" -unsigned int wcn36xx_dbg_mask; +unsigned int wcn36xx_dbg_mask = WCN36XX_DBG_MAC | WCN36XX_DBG_HAL | WCN36XX_DBG_SMD; module_param_named(debug_mask, wcn36xx_dbg_mask, uint, 0644); MODULE_PARM_DESC(debug_mask, "Debugging mask"); @@ -621,6 +621,7 @@ static void wcn36xx_hw_scan_worker(struct work_struct *work) u8 channels[WCN36XX_HAL_PNO_MAX_NETW_CHANNELS_EX]; struct cfg80211_scan_info scan_info = {}; bool aborted = false; + int ch; int i; wcn36xx_dbg(WCN36XX_DBG_MAC, "mac80211 scan %d channels worker\n", req->n_channels); @@ -628,6 +629,8 @@ static void wcn36xx_hw_scan_worker(struct work_struct *work) for (i = 0; i < req->n_channels; i++) channels[i] = req->channels[i]->hw_value; + mutex_lock(&wcn->conf_mutex); + ch = WCN36XX_HW_CHANNEL(wcn); wcn36xx_smd_update_scan_params(wcn, channels, req->n_channels); wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN); @@ -639,6 +642,11 @@ static void wcn36xx_hw_scan_worker(struct work_struct *work) if (aborted) break; + if (ch == req->channels[i]->hw_value) { + wcn36xx_dbg(WCN36XX_DBG_MAC, "Skipping scan on active channel %d\n", ch); + continue; + } + wcn->scan_freq = req->channels[i]->center_freq; wcn->scan_band = req->channels[i]->band; @@ -649,6 +657,7 @@ static void wcn36xx_hw_scan_worker(struct work_struct *work) wcn->scan_freq = 0; } wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN); + mutex_unlock(&wcn->conf_mutex); scan_info.aborted = aborted; ieee80211_scan_completed(wcn->hw, &scan_info);