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