summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoremax <emax@FreeBSD.org>2005-07-27 21:03:35 +0000
committeremax <emax@FreeBSD.org>2005-07-27 21:03:35 +0000
commit8bbe23871b53de4a48c324d7d0221e45f50e7ef0 (patch)
tree50f9ed8b6db8651b4cd72ca149931dbd1204fde3 /sys
parentb8779c810b9f3babd08da008e9fc252ab822d00c (diff)
downloadFreeBSD-src-8bbe23871b53de4a48c324d7d0221e45f50e7ef0.zip
FreeBSD-src-8bbe23871b53de4a48c324d7d0221e45f50e7ef0.tar.gz
Reorganize an_detach() a bit. Make sure ether_ifdetach() and if_free()
are called outside of AN_LOCK()/AN_UNLOCK. This fixes the following WITNESS warning (produced when an(4) PCMCIA card is detached). taskqueue_drain with the following non-sleepable locks held: exclusive sleep mutex an0 (network driver) r = 0 (0xc59af168) locked @ /usr/src/sys/dev/an/if_an.c:2836 MFC after: 3 days Silence from: current@
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/an/if_an.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/dev/an/if_an.c b/sys/dev/an/if_an.c
index 1722471..eade4e1 100644
--- a/sys/dev/an/if_an.c
+++ b/sys/dev/an/if_an.c
@@ -826,18 +826,19 @@ an_detach(device_t dev)
struct an_softc *sc = device_get_softc(dev);
struct ifnet *ifp = sc->an_ifp;
+ AN_LOCK(sc);
if (sc->an_gone) {
+ AN_UNLOCK(sc);
device_printf(dev,"already unloaded\n");
return(0);
}
- AN_LOCK(sc);
an_stop(sc);
+ sc->an_gone = 1;
ifmedia_removeall(&sc->an_ifmedia);
ifp->if_flags &= ~IFF_RUNNING;
+ AN_UNLOCK(sc);
ether_ifdetach(ifp);
if_free(ifp);
- sc->an_gone = 1;
- AN_UNLOCK(sc);
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
an_release_resources(dev);
mtx_destroy(&sc->an_mtx);
OpenPOWER on IntegriCloud