diff options
author | adrian <adrian@FreeBSD.org> | 2014-04-23 05:19:45 +0000 |
---|---|---|
committer | adrian <adrian@FreeBSD.org> | 2014-04-23 05:19:45 +0000 |
commit | 070464547d23d43480cded43a21324674a261a4e (patch) | |
tree | 08eb30596a6ffcf01e0ebd45dc0ac8c7ea23b0df /sys/dev/ath | |
parent | 9c2b40ff1378081489e24d46dd19e674a2bb6de7 (diff) | |
download | FreeBSD-src-070464547d23d43480cded43a21324674a261a4e.zip FreeBSD-src-070464547d23d43480cded43a21324674a261a4e.tar.gz |
Wrap the rate control re-init code in a lock, to serialise it with
concurrent updates from any completing transmits in other threads.
This was exposed when doing power save work - net80211 is constantly
doing reassociations and it's causing the rate control state to get
blanked out. This could cause the rate control code to assert.
This should be MFCed to stable/10 as it's a stability fix.
Tested:
* AR5416, STA
MFC after: 7 days
Diffstat (limited to 'sys/dev/ath')
-rw-r--r-- | sys/dev/ath/if_ath.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index a5bbe42..6c98e60 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -5567,7 +5567,9 @@ ath_newassoc(struct ieee80211_node *ni, int isnew) an->an_mcastrix = ath_tx_findrix(sc, tp->mcastrate); an->an_mgmtrix = ath_tx_findrix(sc, tp->mgmtrate); + ATH_NODE_LOCK(an); ath_rate_newassoc(sc, an, isnew); + ATH_NODE_UNLOCK(an); if (isnew && (vap->iv_flags & IEEE80211_F_PRIVACY) == 0 && sc->sc_hasclrkey && |