]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
wcn36xx: Ensure finish scan is not requested before start scan
authorJoseph Gates <jgates@squareup.com>
Wed, 18 Aug 2021 11:31:43 +0000 (13:31 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Sun, 29 Aug 2021 07:10:35 +0000 (10:10 +0300)
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: 5973a2947430 ("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
drivers/net/wireless/ath/wcn36xx/main.c
drivers/net/wireless/ath/wcn36xx/wcn36xx.h

index d202f2128df23ac2cf8eaede1bf2072985e6ccd6..67f4db662402be29cb406450629398afbbd198b6 100644 (file)
@@ -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
index 6121d8a5641ab83736291989851e12bb23e86b22..0feb235b5a426b0aec9b6fcfde809c3a4691377e 100644 (file)
@@ -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;