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);
_______________________________________________
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