summaryrefslogtreecommitdiffstats
path: root/sys/dev/wpi
diff options
context:
space:
mode:
authorbenjsc <benjsc@FreeBSD.org>2007-11-27 09:09:09 +0000
committerbenjsc <benjsc@FreeBSD.org>2007-11-27 09:09:09 +0000
commit5ea08ee1129594ac4413de68021a12c2008a2c30 (patch)
treee19230158140833f1177fd84a1233a65f61b99a4 /sys/dev/wpi
parent981215a5d399f0c53f50e0ff06b9fc40658df99d (diff)
downloadFreeBSD-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.c5
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:
OpenPOWER on IntegriCloud