summaryrefslogtreecommitdiffstats
path: root/sys/dev/ath
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2014-04-23 05:19:45 +0000
committeradrian <adrian@FreeBSD.org>2014-04-23 05:19:45 +0000
commit070464547d23d43480cded43a21324674a261a4e (patch)
tree08eb30596a6ffcf01e0ebd45dc0ac8c7ea23b0df /sys/dev/ath
parent9c2b40ff1378081489e24d46dd19e674a2bb6de7 (diff)
downloadFreeBSD-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.c2
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 &&
OpenPOWER on IntegriCloud