git: a1272e7d9621 - stable/13 - LinuxKPI: 802.11: improve hw_scan fallback to sw_scan

From: Bjoern A. Zeeb <bz_at_FreeBSD.org>
Date: Sun, 27 Mar 2022 20:14:15 UTC
The branch stable/13 has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=a1272e7d9621f95ca53f1bdef5ed78be12cac277

commit a1272e7d9621f95ca53f1bdef5ed78be12cac277
Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2022-03-24 17:49:59 +0000
Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2022-03-27 18:12:49 +0000

    LinuxKPI: 802.11: improve hw_scan fallback to sw_scan
    
    Extending what was started in d3ef7fb459ff924911e5276db0c04b13cd8074d9,
    when a driver signals that hw_scan is not possible and expects a sw_scan
    to be preformed we triggered a sw_scan towards the driver but did not
    let net80211 know.
    Cancel the initial scan towards net80211.  If we we defer to sw_scan
    then clear IEEE80211_FEXT_SCAN_OFFLOAD so net80211 will send probe
    requests, and actively start a new scan with net80211.
    This may have to be further refined in the future but seems to work
    for the moment.
    
    Sponsored by:   The FreeBSD Foundation
    
    (cherry picked from commit 196cfd0b2eb640a63d007a7e9c3a74e4256255f3)
---
 sys/compat/linuxkpi/common/src/linux_80211.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c
index 727c0e276af9..384d068d7920 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -2547,17 +2547,27 @@ sw_scan:
 			free(hw_req, M_LKPI80211);
 			lhw->hw_req = NULL;
 
+			ieee80211_cancel_scan(vap);
 			/*
 			 * XXX-SIGH magic number.
 			 * rtw88 has a magic "return 1" if offloading scan is
 			 * not possible.  Fall back to sw scan in that case.
 			 */
-			if (error == 1)
+			if (error == 1) {
+				vap->iv_flags_ext &= ~IEEE80211_FEXT_SCAN_OFFLOAD;
+				ieee80211_start_scan(vap,
+				    IEEE80211_SCAN_ACTIVE |
+				    IEEE80211_SCAN_NOPICK |
+				    IEEE80211_SCAN_ONCE,
+				    IEEE80211_SCAN_FOREVER,
+				    ss->ss_mindwell ? ss->ss_mindwell : msecs_to_ticks(20),
+				    ss->ss_maxdwell ? ss->ss_maxdwell : msecs_to_ticks(200),
+				    vap->iv_des_nssid, vap->iv_des_ssid);
 				goto sw_scan;
+			}
 
 			ic_printf(ic, "ERROR: %s: hw_scan returned %d\n",
 			    __func__, error);
-			ieee80211_cancel_scan(vap);
 		}
 	}
 }