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:
parent
d9610574a2
commit
8a03cf5c82
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user