summaryrefslogtreecommitdiffstats
path: root/sys/dev/gem
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2009-06-24 19:04:08 +0000
committermarius <marius@FreeBSD.org>2009-06-24 19:04:08 +0000
commit6aa8875fe368ce4daf22cd0d2b035542157fb859 (patch)
treedfe6aaed33d61a981026fe9d2c70e8bb5b0df6da /sys/dev/gem
parent4208ef996734cc86a5d2151d45f22c675eb837ea (diff)
downloadFreeBSD-src-6aa8875fe368ce4daf22cd0d2b035542157fb859.zip
FreeBSD-src-6aa8875fe368ce4daf22cd0d2b035542157fb859.tar.gz
Revert the part of r194763 which added a dying flag and instead
call ether_ifdetach(9) before stopping the controller and the callouts. The consensus is that the latter is now safe to do and should also solve the problem of active BPF listeners clearing promiscuous mode can result in the tick callout being restarted which in turn will trigger a panic once it's actually gone.
Diffstat (limited to 'sys/dev/gem')
-rw-r--r--sys/dev/gem/if_gem.c8
-rw-r--r--sys/dev/gem/if_gemvar.h9
2 files changed, 5 insertions, 12 deletions
diff --git a/sys/dev/gem/if_gem.c b/sys/dev/gem/if_gem.c
index 6361519..86c9334 100644
--- a/sys/dev/gem/if_gem.c
+++ b/sys/dev/gem/if_gem.c
@@ -403,15 +403,14 @@ gem_detach(struct gem_softc *sc)
struct ifnet *ifp = sc->sc_ifp;
int i;
+ ether_ifdetach(ifp);
GEM_LOCK(sc);
- sc->sc_flags |= GEM_DYING;
gem_stop(ifp, 1);
GEM_UNLOCK(sc);
callout_drain(&sc->sc_tick_ch);
#ifdef GEM_RINT_TIMEOUT
callout_drain(&sc->sc_rx_ch);
#endif
- ether_ifdetach(ifp);
if_free(ifp);
device_delete_child(sc->sc_dev, sc->sc_miibus);
@@ -2107,11 +2106,6 @@ gem_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
switch (cmd) {
case SIOCSIFFLAGS:
GEM_LOCK(sc);
- if ((sc->sc_flags & GEM_DYING) != 0) {
- error = EINVAL;
- GEM_UNLOCK(sc);
- break;
- }
if ((ifp->if_flags & IFF_UP) != 0) {
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
((ifp->if_flags ^ sc->sc_ifflags) &
diff --git a/sys/dev/gem/if_gemvar.h b/sys/dev/gem/if_gemvar.h
index 48e3299..ab5b2f6 100644
--- a/sys/dev/gem/if_gemvar.h
+++ b/sys/dev/gem/if_gemvar.h
@@ -141,11 +141,10 @@ struct gem_softc {
u_int sc_flags;
#define GEM_INITED (1 << 0) /* reset persistent regs init'ed */
-#define GEM_DYING (1 << 1) /* detach initiated */
-#define GEM_LINK (1 << 2) /* link is up */
-#define GEM_PCI (1 << 3) /* PCI busses are little-endian */
-#define GEM_PCI66 (1 << 4) /* PCI bus runs at 66MHz */
-#define GEM_SERDES (1 << 5) /* use the SERDES */
+#define GEM_LINK (1 << 1) /* link is up */
+#define GEM_PCI (1 << 2) /* PCI busses are little-endian */
+#define GEM_PCI66 (1 << 3) /* PCI bus runs at 66MHz */
+#define GEM_SERDES (1 << 4) /* use the SERDES */
/*
* ring buffer DMA stuff
OpenPOWER on IntegriCloud