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@
This commit is contained in:
Maksim Yevmenkin 2005-07-27 21:03:35 +00:00
parent d9610574a2
commit 8a03cf5c82

View File

@ -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);