wcn36xx: Ensure finish scan is not requested before start scan
If the operating channel is the first in the scan list, it was seen that
a finish scan request would be sent before a start scan request was
sent, causing the firmware to fail all future scans. Track the current
channel being scanned to avoid requesting the scan finish before it
starts.
Cc: <stable@vger.kernel.org>
Fixes: 5973a29474
("wcn36xx: Fix software-driven scan")
Signed-off-by: Joseph Gates <jgates@squareup.com>
Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1629286303-13179-1-git-send-email-loic.poulain@linaro.org
This commit is contained in:
parent
e3f30ab28a
commit
d195d7aac0
|
@ -408,13 +408,14 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
|
|||
wcn36xx_dbg(WCN36XX_DBG_MAC, "wcn36xx_config channel switch=%d\n",
|
||||
ch);
|
||||
|
||||
if (wcn->sw_scan_opchannel == ch) {
|
||||
if (wcn->sw_scan_opchannel == ch && wcn->sw_scan_channel) {
|
||||
/* If channel is the initial operating channel, we may
|
||||
* want to receive/transmit regular data packets, then
|
||||
* simply stop the scan session and exit PS mode.
|
||||
*/
|
||||
wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN,
|
||||
wcn->sw_scan_vif);
|
||||
wcn->sw_scan_channel = 0;
|
||||
} else if (wcn->sw_scan) {
|
||||
/* A scan is ongoing, do not change the operating
|
||||
* channel, but start a scan session on the channel.
|
||||
|
@ -422,6 +423,7 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
|
|||
wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN,
|
||||
wcn->sw_scan_vif);
|
||||
wcn36xx_smd_start_scan(wcn, ch);
|
||||
wcn->sw_scan_channel = ch;
|
||||
} else {
|
||||
wcn36xx_change_opchannel(wcn, ch);
|
||||
}
|
||||
|
@ -702,6 +704,7 @@ static void wcn36xx_sw_scan_start(struct ieee80211_hw *hw,
|
|||
|
||||
wcn->sw_scan = true;
|
||||
wcn->sw_scan_vif = vif;
|
||||
wcn->sw_scan_channel = 0;
|
||||
if (vif_priv->sta_assoc)
|
||||
wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn);
|
||||
else
|
||||
|
|
|
@ -246,6 +246,7 @@ struct wcn36xx {
|
|||
struct cfg80211_scan_request *scan_req;
|
||||
bool sw_scan;
|
||||
u8 sw_scan_opchannel;
|
||||
u8 sw_scan_channel;
|
||||
struct ieee80211_vif *sw_scan_vif;
|
||||
struct mutex scan_lock;
|
||||
bool scan_aborted;
|
||||
|
|
Loading…
Reference in New Issue