Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Jul 2010 11:52:20 +0000 (UTC)
From:      Bernhard Schmidt <bschmidt@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r210114 - head/sys/dev/iwn
Message-ID:  <201007151152.o6FBqKoH077953@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bschmidt
Date: Thu Jul 15 11:52:20 2010
New Revision: 210114
URL: http://svn.freebsd.org/changeset/base/210114

Log:
  Handle RUN->ASSOC->RUN transition correctly, as in not trigger a
  firmware error. Convert if statements to a switch statement while
  I'm here.
  
  Tested by:	Benjamin Kaduk <kaduk at mit.edu>
  MFC after:	2 weeks

Modified:
  head/sys/dev/iwn/if_iwn.c

Modified: head/sys/dev/iwn/if_iwn.c
==============================================================================
--- head/sys/dev/iwn/if_iwn.c	Thu Jul 15 11:26:07 2010	(r210113)
+++ head/sys/dev/iwn/if_iwn.c	Thu Jul 15 11:52:20 2010	(r210114)
@@ -1940,27 +1940,44 @@ iwn_newstate(struct ieee80211vap *vap, e
 	IWN_LOCK(sc);
 	callout_stop(&sc->sc_timer_to);
 
-	if (nstate == IEEE80211_S_AUTH && vap->iv_state != IEEE80211_S_AUTH) {
-		/* !AUTH -> AUTH requires adapter config */
-		/* Reset state to handle reassociations correctly. */
+	switch (nstate) {
+	case IEEE80211_S_ASSOC:
+		if (vap->iv_state != IEEE80211_S_RUN)
+			break;
+		/* FALLTHROUGH */
+	case IEEE80211_S_AUTH:
+		if (vap->iv_state == IEEE80211_S_AUTH)
+			break;
+
+		/*
+		 * !AUTH -> AUTH transition requires state reset to handle
+		 * reassociations correctly.
+		 */
 		sc->rxon.associd = 0;
 		sc->rxon.filter &= ~htole32(IWN_FILTER_BSS);
 		iwn_calib_reset(sc);
 		error = iwn_auth(sc, vap);
-	}
-	if (nstate == IEEE80211_S_RUN && vap->iv_state != IEEE80211_S_RUN) {
+		break;
+
+	case IEEE80211_S_RUN:
+		/*
+		 * RUN -> RUN transition; Just restart the timers.
+		 */
+		if (vap->iv_state == IEEE80211_S_RUN) {
+			iwn_calib_reset(sc);
+			break;
+		}
+
 		/*
 		 * !RUN -> RUN requires setting the association id
 		 * which is done with a firmware cmd.  We also defer
 		 * starting the timers until that work is done.
 		 */
 		error = iwn_run(sc, vap);
-	}
-	if (nstate == IEEE80211_S_RUN) {
-		/*
-		 * RUN -> RUN transition; just restart the timers.
-		 */
-		iwn_calib_reset(sc);
+		break;
+
+	default:
+		break;
 	}
 	IWN_UNLOCK(sc);
 	IEEE80211_LOCK(ic);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007151152.o6FBqKoH077953>