The new iwm(4) firmware (see [1]) scans 2GHz and 5 GHz bands in one go.
[1] http://marc.info/?l=openbsd-tech&m=146356530605833&w=2

Our net80211 stack isn't set up to handle this correctly.
With the new firmware (and diff from [1]), you'll see no scan results
at all if you run:

  ifconfig iwm0 nwid some-nwid-that-doesnt-exist-on-2ghz
  ifconfig iwm0 scan

This happens because the net80211 stack clears scan results from memory
before results are returned to ifconfig, and retries on a different band.
The driver however insists that it is already done scanning everything,
and does nothing (a SCAN->SCAN transition is a no-op in the driver).
So the second scan attempt times out, and ifconfig gets no results.

This diff adds a 'scan all bands' capability which the driver can advertise
to tell the net80211 layer that it should not retry the scan on a different
band. Setting this flag in the iwm(4) driver then fixes the issue.

(Note that the comment immediately below refers to a 'next mode' instead of
'next band' because it dates from a time when a mode implied a band, as in
11b -> 2GHz and 11a -> 5 GHz. Nowadays, we have 11n mode uses both bands.)

ok?

Index: ieee80211_node.c
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_node.c,v
retrieving revision 1.102
diff -u -p -r1.102 ieee80211_node.c
--- ieee80211_node.c    18 May 2016 08:15:28 -0000      1.102
+++ ieee80211_node.c    20 May 2016 09:05:39 -0000
@@ -581,6 +581,10 @@ ieee80211_end_scan(struct ifnet *ifp)
                        goto wakeup;
                }
 #endif
+               /* If the device scans all bands at once, we're done. */
+               if (ic->ic_caps & IEEE80211_C_SCANALLBAND)
+                       goto wakeup;
+
                /*
                 * Scan the next mode if nothing has been found. This
                 * is necessary if the device supports different
Index: ieee80211_var.h
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_var.h,v
retrieving revision 1.71
diff -u -p -r1.71 ieee80211_var.h
--- ieee80211_var.h     25 Jan 2016 11:27:11 -0000      1.71
+++ ieee80211_var.h     20 May 2016 08:56:14 -0000
@@ -369,6 +369,7 @@ extern struct ieee80211com_head ieee8021
 #define IEEE80211_C_RSN                0x00001000      /* CAPABILITY: RSN 
avail */
 #define IEEE80211_C_MFP                0x00002000      /* CAPABILITY: MFP 
avail */
 #define IEEE80211_C_RAWCTL     0x00004000      /* CAPABILITY: raw ctl */
+#define IEEE80211_C_SCANALLBAND        0x00008000      /* CAPABILITY: scan all 
bands */
 
 /* flags for ieee80211_fix_rate() */
 #define        IEEE80211_F_DOSORT      0x00000001      /* sort rate list */

Reply via email to