summaryrefslogtreecommitdiffstats
path: root/sys/dev/et
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2011-12-06 00:58:42 +0000
committeryongari <yongari@FreeBSD.org>2011-12-06 00:58:42 +0000
commit9c8a75d791cffa7aac7d2db7d46ce7711b31494f (patch)
treea3405d15c8070bb8f50349d3bb234379dfdef847 /sys/dev/et
parent34f19f4f468ebbf3f4f8b2303e4c773218d00ccf (diff)
downloadFreeBSD-src-9c8a75d791cffa7aac7d2db7d46ce7711b31494f.zip
FreeBSD-src-9c8a75d791cffa7aac7d2db7d46ce7711b31494f.tar.gz
Make et_probe() return BUS_PROBE_DEFAULT such that allow other
driver that has high precedence for the controller override et(4). Add missing callout_drain(9) in device detach and rework detach routine. While I'm here use rman_get_rid(9) instead of using cached resource id because bus methods are free to change the id.
Diffstat (limited to 'sys/dev/et')
-rw-r--r--sys/dev/et/if_et.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/sys/dev/et/if_et.c b/sys/dev/et/if_et.c
index dac78b8..66df867 100644
--- a/sys/dev/et/if_et.c
+++ b/sys/dev/et/if_et.c
@@ -226,7 +226,7 @@ et_probe(device_t dev)
for (d = et_devices; d->desc != NULL; ++d) {
if (vid == d->vid && did == d->did) {
device_set_desc(dev, d->desc);
- return (0);
+ return (BUS_PROBE_DEFAULT);
}
}
return (ENXIO);
@@ -378,31 +378,27 @@ et_detach(device_t dev)
struct et_softc *sc = device_get_softc(dev);
if (device_is_attached(dev)) {
- struct ifnet *ifp = sc->ifp;
-
+ ether_ifdetach(sc->ifp);
ET_LOCK(sc);
et_stop(sc);
- bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_handle);
ET_UNLOCK(sc);
-
- ether_ifdetach(ifp);
+ callout_drain(&sc->sc_tick);
}
if (sc->sc_miibus != NULL)
device_delete_child(dev, sc->sc_miibus);
bus_generic_detach(dev);
- if (sc->sc_irq_res != NULL) {
- bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irq_rid,
- sc->sc_irq_res);
- }
+ if (sc->sc_irq_handle != NULL)
+ bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_handle);
+ if (sc->sc_irq_res != NULL)
+ bus_release_resource(dev, SYS_RES_IRQ,
+ rman_get_rid(sc->sc_irq_res), sc->sc_irq_res);
if ((sc->sc_flags & ET_FLAG_MSI) != 0)
pci_release_msi(dev);
-
- if (sc->sc_mem_res != NULL) {
- bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mem_rid,
- sc->sc_mem_res);
- }
+ if (sc->sc_mem_res != NULL)
+ bus_release_resource(dev, SYS_RES_MEMORY,
+ rman_get_rid(sc->sc_mem_res), sc->sc_mem_res);
if (sc->ifp != NULL)
if_free(sc->ifp);
OpenPOWER on IntegriCloud