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.
This commit is contained in:
Marius Strobl 2009-06-24 19:04:08 +00:00
parent 2dd43ecaec
commit b3a1f860fa
2 changed files with 5 additions and 12 deletions

View file

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

View file

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