diff options
author | Adrian Chadd <adrian@FreeBSD.org> | 2012-03-02 02:57:10 +0000 |
---|---|---|
committer | Adrian Chadd <adrian@FreeBSD.org> | 2012-03-02 02:57:10 +0000 |
commit | c98cefc5db35528ddfa3ad8a2ba192fd89cab71e (patch) | |
tree | b9a55dd40ea0863f8b12d352acf491d24a29a491 /sys/dev/ath/if_ath.c | |
parent | 66b74386c778eb948880716e53f864aadc727a7a (diff) | |
download | src-c98cefc5db35528ddfa3ad8a2ba192fd89cab71e.tar.gz src-c98cefc5db35528ddfa3ad8a2ba192fd89cab71e.zip |
Wrap the scan code state change stuff behind ATH_LOCK and the PCU fiddling
behind the PCU lock.
sc_scanning is being checked without ATH_LOCK behind held and could
in theory run from multiple threads.
Notes
Notes:
svn path=/head/; revision=232374
Diffstat (limited to 'sys/dev/ath/if_ath.c')
-rw-r--r-- | sys/dev/ath/if_ath.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index c6556cbdab93..1b02f6a8c073 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -5637,11 +5637,16 @@ ath_scan_start(struct ieee80211com *ic) /* XXX calibration timer? */ + ATH_LOCK(sc); sc->sc_scanning = 1; sc->sc_syncbeacon = 0; rfilt = ath_calcrxfilter(sc); + ATH_UNLOCK(sc); + + ATH_PCU_LOCK(sc); ath_hal_setrxfilter(ah, rfilt); ath_hal_setassocid(ah, ifp->if_broadcastaddr, 0); + ATH_PCU_UNLOCK(sc); DPRINTF(sc, ATH_DEBUG_STATE, "%s: RX filter 0x%x bssid %s aid 0\n", __func__, rfilt, ether_sprintf(ifp->if_broadcastaddr)); @@ -5655,12 +5660,17 @@ ath_scan_end(struct ieee80211com *ic) struct ath_hal *ah = sc->sc_ah; u_int32_t rfilt; + ATH_LOCK(sc); sc->sc_scanning = 0; rfilt = ath_calcrxfilter(sc); + ATH_UNLOCK(sc); + + ATH_PCU_LOCK(sc); ath_hal_setrxfilter(ah, rfilt); ath_hal_setassocid(ah, sc->sc_curbssid, sc->sc_curaid); ath_hal_process_noisefloor(ah); + ATH_PCU_UNLOCK(sc); DPRINTF(sc, ATH_DEBUG_STATE, "%s: RX filter 0x%x bssid %s aid 0x%x\n", __func__, rfilt, ether_sprintf(sc->sc_curbssid), |