--- if_dc.c.orig 2008-08-05 09:35:03.410151380 +0800 +++ if_dc.c 2008-08-05 09:37:56.030761686 +0800 @@ -1261,6 +1261,9 @@ dc_setfilt_xircom(struct dc_softc *sc) int i; ifp = &sc->arpcom.ac_if; + KASSERT(ifp->if_flags & IFF_RUNNING, + ("%s is not running yet\n", ifp->if_xname)); + DC_CLRBIT(sc, DC_NETCFG, (DC_NETCFG_TX_ON|DC_NETCFG_RX_ON)); i = sc->dc_cdata.dc_tx_prod; @@ -1307,7 +1310,6 @@ dc_setfilt_xircom(struct dc_softc *sc) DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_TX_ON); DC_SETBIT(sc, DC_NETCFG, DC_NETCFG_RX_ON); - ifp->if_flags |= IFF_RUNNING; sframe->dc_status = DC_TXSTAT_OWN; CSR_WRITE_4(sc, DC_TXSTART, 0xFFFFFFFF); @@ -2912,7 +2914,7 @@ dc_intr(void *arg) return ; /* Suppress unwanted interrupts */ - if (!(ifp->if_flags & IFF_UP)) { + if ((ifp->if_flags & IFF_RUNNING) == 0) { if (CSR_READ_4(sc, DC_ISR) & DC_INTRS) dc_stop(sc); return; @@ -3288,6 +3290,13 @@ dc_init(void *xsc) } /* + * Set IFF_RUNNING here to keep the assertion in dc_setfilt() + * working. + */ + ifp->if_flags |= IFF_RUNNING; + ifp->if_flags &= ~IFF_OACTIVE; + + /* * Load the RX/multicast filter. We do this sort of late * because the filter programming scheme on the 21143 and * some clones requires DMAing a setup frame via the TX @@ -3302,9 +3311,6 @@ dc_init(void *xsc) mii_mediachg(mii); dc_setcfg(sc, sc->dc_if_media); - ifp->if_flags |= IFF_RUNNING; - ifp->if_flags &= ~IFF_OACTIVE; - /* Don't start the ticker if this is a homePNA link. */ if (IFM_SUBTYPE(mii->mii_media.ifm_media) == IFM_HPNA_1) sc->dc_link = 1; @@ -3314,8 +3320,6 @@ dc_init(void *xsc) else callout_reset(&sc->dc_stat_timer, hz, dc_tick, sc); } - - return; } /* @@ -3394,12 +3398,11 @@ dc_ioctl(struct ifnet *ifp, u_long comma dc_stop(sc); } sc->dc_if_flags = ifp->if_flags; - error = 0; break; case SIOCADDMULTI: case SIOCDELMULTI: - dc_setfilt(sc); - error = 0; + if (ifp->if_flags & IFF_RUNNING) + dc_setfilt(sc); break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: