svn commit: r216238 - head/sys/dev/wpi

Bernhard Schmidt bschmidt at FreeBSD.org
Mon Dec 6 19:05:45 UTC 2010


Author: bschmidt
Date: Mon Dec  6 19:05:44 2010
New Revision: 216238
URL: http://svn.freebsd.org/changeset/base/216238

Log:
  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.
  
  Tested by:	Zhihao Yuan <lichray at gmail.com>
  MFC after:	1 week

Modified:
  head/sys/dev/wpi/if_wpi.c

Modified: head/sys/dev/wpi/if_wpi.c
==============================================================================
--- head/sys/dev/wpi/if_wpi.c	Mon Dec  6 18:28:39 2010	(r216237)
+++ head/sys/dev/wpi/if_wpi.c	Mon Dec  6 19:05:44 2010	(r216238)
@@ -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,


More information about the svn-src-all mailing list