Author: adrian
Date: Thu Jan 31 00:14:25 2013
New Revision: 246141
URL: http://svnweb.freebsd.org/changeset/base/246141

Log:
  Work around some rather unfortunate race conditions inside net80211.
  
  Right now, ic_curchan seems to be updated rather quickly (ie, during
  the ioctl) and before the driver gets notified of what's going on.
  So what I was seeing was:
  
  * NIC was in channel X;
  * It generates PHY errors for channel X;
  * an ioctl comes along from userland and changes things to channel Y;
  * .. this updates ic_curchan, but hasn't yet reset the hardware;
  * in parallel, RX is occuring and it looks at ic_curchan;
  * .. which is channel Y, so events get stamped with that now.
  
  Sigh.

Modified:
  head/sys/dev/ath/if_ath_rx.c

Modified: head/sys/dev/ath/if_ath_rx.c
==============================================================================
--- head/sys/dev/ath/if_ath_rx.c        Thu Jan 31 00:02:49 2013        
(r246140)
+++ head/sys/dev/ath/if_ath_rx.c        Thu Jan 31 00:14:25 2013        
(r246141)
@@ -431,18 +431,16 @@ ath_rx_tap(struct ifnet *ifp, struct mbu
 #ifdef AH_SUPPORT_AR5416
        sc->sc_rx_th.wr_chan_flags &= ~CHAN_HT;
        if (rs->rs_status & HAL_RXERR_PHY) {
-               struct ieee80211com *ic = ifp->if_l2com;
-
                /*
                 * PHY error - make sure the channel flags
                 * reflect the actual channel configuration,
                 * not the received frame.
                 */
-               if (IEEE80211_IS_CHAN_HT40U(ic->ic_curchan))
+               if (IEEE80211_IS_CHAN_HT40U(sc->sc_curchan))
                        sc->sc_rx_th.wr_chan_flags |= CHAN_HT40U;
-               else if (IEEE80211_IS_CHAN_HT40D(ic->ic_curchan))
+               else if (IEEE80211_IS_CHAN_HT40D(sc->sc_curchan))
                        sc->sc_rx_th.wr_chan_flags |= CHAN_HT40D;
-               else if (IEEE80211_IS_CHAN_HT20(ic->ic_curchan))
+               else if (IEEE80211_IS_CHAN_HT20(sc->sc_curchan))
                        sc->sc_rx_th.wr_chan_flags |= CHAN_HT20;
        } else if (sc->sc_rx_th.wr_rate & IEEE80211_RATE_MCS) { /* HT rate */
                struct ieee80211com *ic = ifp->if_l2com;
_______________________________________________
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