From 8f1d4b2dd69f6cfb5ba5d43ec63a5367ca2c9c6e Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 3 Aug 2014 03:51:33 +0000 Subject: [PATCH] Do the iwn(4) panic reinitialisation under IWN_LOCK(). I've checked each of the functions being called and there's either a _locked version or it's supposed to be called with IWN_LOCK() held. --- sys/dev/iwn/if_iwn.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index c45d231af0e..1b4c96a2efe 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -8465,9 +8465,10 @@ iwn_panicked(void *arg0, int pending) device_printf(sc->sc_dev, "%s: controller panicked, iv_state = %d; " "resetting...\n", __func__, vap->iv_state); - iwn_stop(sc); - iwn_init(sc); - iwn_start(sc->sc_ifp); + IWN_LOCK(sc); + + iwn_stop_locked(sc); + iwn_init_locked(sc); if (vap->iv_state >= IEEE80211_S_AUTH && (error = iwn_auth(sc, vap)) != 0) { device_printf(sc->sc_dev, @@ -8478,6 +8479,11 @@ iwn_panicked(void *arg0, int pending) device_printf(sc->sc_dev, "%s: could not move to run state\n", __func__); } + + /* Only run start once the NIC is in a useful state, like associated */ + iwn_start_locked(sc->sc_ifp); + + IWN_UNLOCK(sc); } static void