diff options
author | benjsc <benjsc@FreeBSD.org> | 2007-11-27 09:09:09 +0000 |
---|---|---|
committer | benjsc <benjsc@FreeBSD.org> | 2007-11-27 09:09:09 +0000 |
commit | 5ea08ee1129594ac4413de68021a12c2008a2c30 (patch) | |
tree | e19230158140833f1177fd84a1233a65f61b99a4 /sys/dev/wpi | |
parent | 981215a5d399f0c53f50e0ff06b9fc40658df99d (diff) | |
download | FreeBSD-src-5ea08ee1129594ac4413de68021a12c2008a2c30.zip FreeBSD-src-5ea08ee1129594ac4413de68021a12c2008a2c30.tar.gz |
Fix up a race condition with the callout_stop method in newstate.
The call should happen with the driver lock held. We don't hold the driver
lock in newstate as it's a separate thread where we can't sleep (and we only
call wpi_cmd in async mode).
Discovered By: Attillo's callout rework
Approved By: mlaier (comentor)
Diffstat (limited to 'sys/dev/wpi')
-rw-r--r-- | sys/dev/wpi/if_wpi.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c index 981fdce..98c5b92 100644 --- a/sys/dev/wpi/if_wpi.c +++ b/sys/dev/wpi/if_wpi.c @@ -16,7 +16,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define VERSION "20071102" +#define VERSION "20071127" #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); @@ -1331,8 +1331,11 @@ wpi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg) struct wpi_softc *sc = ifp->if_softc; struct ieee80211_node *ni; int error; + WPI_LOCK_DECL; + WPI_LOCK(sc); callout_stop(&sc->calib_to); + WPI_UNLOCK(sc); switch (nstate) { case IEEE80211_S_SCAN: |