From 8bbe23871b53de4a48c324d7d0221e45f50e7ef0 Mon Sep 17 00:00:00 2001 From: emax Date: Wed, 27 Jul 2005 21:03:35 +0000 Subject: 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@ --- sys/dev/an/if_an.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'sys/dev/an/if_an.c') 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); -- cgit v1.1