svn commit: r246141 - head/sys/dev/ath

Adrian Chadd adrian at FreeBSD.org
Thu Jan 31 00:14:25 UTC 2013


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;


More information about the svn-src-head mailing list