Author: bschmidt
Date: Mon Dec 13 17:53:41 2010
New Revision: 216411
URL: http://svn.freebsd.org/changeset/base/216411

Log:
  MFC r216238:
  Fix scanning after loosing a connection. The firmware assumes that as long
  as an association ID is set any scan is supposed to be a background scan.
  This implies that the firmware will switch back to the associated channel
  after a certain threshold, though, we are not notified about that. We
  currently catch this case by a timer which will reset the firmware after
  a 'scan timeout', though, upper layers are not notified about that and
  will simply hang until manual intervention. Fix this by resetting the
  firmware's knowledge about any association on RUN -> ASSOC and
  !INIT -> SCAN transitions.
  
  Approved by:  re (kib)

Modified:
  stable/8/sys/dev/wpi/if_wpi.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/dev/wpi/if_wpi.c
==============================================================================
--- stable/8/sys/dev/wpi/if_wpi.c       Mon Dec 13 17:53:38 2010        
(r216410)
+++ stable/8/sys/dev/wpi/if_wpi.c       Mon Dec 13 17:53:41 2010        
(r216411)
@@ -1248,8 +1248,25 @@ wpi_newstate(struct ieee80211vap *vap, e
 
        IEEE80211_UNLOCK(ic);
        WPI_LOCK(sc);
-       if (nstate == IEEE80211_S_AUTH) {
-               /* The node must be registered in the firmware before auth */
+       if (nstate == IEEE80211_S_SCAN && vap->iv_state != IEEE80211_S_INIT) {
+               /*
+                * On !INIT -> SCAN transitions, we need to clear any possible
+                * knowledge about associations.
+                */
+               error = wpi_config(sc);
+               if (error != 0) {
+                       device_printf(sc->sc_dev,
+                           "%s: device config failed, error %d\n",
+                           __func__, error);
+               }
+       }
+       if (nstate == IEEE80211_S_AUTH ||
+           (nstate == IEEE80211_S_ASSOC && vap->iv_state == IEEE80211_S_RUN)) {
+               /*
+                * The node must be registered in the firmware before auth.
+                * Also the associd must be cleared on RUN -> ASSOC
+                * transitions.
+                */
                error = wpi_auth(sc, vap);
                if (error != 0) {
                        device_printf(sc->sc_dev,
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to