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.
This commit is contained in:
parent
b713097ae3
commit
b8f355bf50
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=246141
@ -431,18 +431,16 @@ ath_rx_tap(struct ifnet *ifp, struct mbuf *m,
|
||||
#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;
|
||||
|
Loading…
Reference in New Issue
Block a user