summaryrefslogtreecommitdiffstats
path: root/sys/dev/ath/if_ath.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ath/if_ath.c')
-rw-r--r--sys/dev/ath/if_ath.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c
index e766a38..10a1b6d 100644
--- a/sys/dev/ath/if_ath.c
+++ b/sys/dev/ath/if_ath.c
@@ -330,7 +330,6 @@ ath_detach(struct ath_softc *sc)
DPRINTF(("ath_detach: if_flags %x\n", ifp->if_flags));
- mtx_lock(&sc->sc_mtx);
ath_stop(ifp);
bpfdetach(ifp);
ath_desc_free(sc);
@@ -851,8 +850,19 @@ ath_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
* only reflect promisc mode settings.
*/
ath_mode_init(sc);
- } else
- ath_init(ifp); /* XXX lose error */
+ } else {
+ /*
+ * Beware of being called during detach to
+ * reset promiscuous mode. In that case we
+ * will still be marked UP but not RUNNING.
+ * However trying to re-init the interface
+ * is the wrong thing to do as we've already
+ * torn down much of our state. There's
+ * probably a better way to deal with this.
+ */
+ if (!sc->sc_invalid)
+ ath_init(ifp); /* XXX lose error */
+ }
} else
ath_stop(ifp);
break;
OpenPOWER on IntegriCloud