summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Leffler <sam@FreeBSD.org>2003-10-13 03:39:38 +0000
committerSam Leffler <sam@FreeBSD.org>2003-10-13 03:39:38 +0000
commit2075afba8de79c5f28df07581faad47d04c64e57 (patch)
tree4b47f9fa3e0ece8f01b6f0be00d9cc88c1eaba9d
parent310e4a4ae64f6c4f919f42784a369632603bb0df (diff)
Notes
-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 e766a38951ae..10a1b6d9c822 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;