Commit d195d7aa authored by Joseph Gates's avatar Joseph Gates Committed by Kalle Valo
Browse files

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: 5973a294 ("wcn36xx: Fix software-driven scan")
Signed-off-by: default avatarJoseph Gates <jgates@squareup.com>
Signed-off-by: default avatarLoic Poulain <loic.poulain@linaro.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1629286303-13179-1-git-send-email-loic.poulain@linaro.org
parent e3f30ab2
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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;