--- src/sys/dev/netif/re/if_re.c 2008/06/25 11:02:33 1.44 +++ src/sys/dev/netif/re/if_re.c 2008/07/26 16:12:06 1.45 @@ -214,6 +214,9 @@ static const struct re_hwrev re_hwrevs[] static int re_probe(device_t); static int re_attach(device_t); static int re_detach(device_t); +static int re_suspend(device_t); +static int re_resume(device_t); +static void re_shutdown(device_t); static int re_encap(struct re_softc *, struct mbuf **, int *, int *); @@ -229,14 +232,12 @@ static void re_txeof(struct re_softc *); static void re_intr(void *); static void re_tick(void *); static void re_tick_serialized(void *); + static void re_start(struct ifnet *); static int re_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *); static void re_init(void *); static void re_stop(struct re_softc *); static void re_watchdog(struct ifnet *); -static int re_suspend(device_t); -static int re_resume(device_t); -static void re_shutdown(device_t); static int re_ifmedia_upd(struct ifnet *); static void re_ifmedia_sts(struct ifnet *, struct ifmediareq *); @@ -1734,6 +1735,8 @@ re_tick_serialized(void *xsc) struct ifnet *ifp = &sc->arpcom.ac_if; struct mii_data *mii; + ASSERT_SERIALIZED(ifp->if_serializer); + mii = device_get_softc(sc->re_miibus); mii_tick(mii); if (sc->re_link) { @@ -1758,6 +1761,8 @@ re_poll(struct ifnet *ifp, enum poll_cmd { struct re_softc *sc = ifp->if_softc; + ASSERT_SERIALIZED(ifp->if_serializer); + switch(cmd) { case POLL_REGISTER: /* disable interrupts */ @@ -1805,6 +1810,8 @@ re_intr(void *arg) struct ifnet *ifp = &sc->arpcom.ac_if; uint16_t status; + ASSERT_SERIALIZED(ifp->if_serializer); + if (sc->suspended || (ifp->if_flags & IFF_UP) == 0) return; @@ -1999,6 +2006,8 @@ re_start(struct ifnet *ifp) struct mbuf *m_head2; int called_defrag, idx, need_trans; + ASSERT_SERIALIZED(ifp->if_serializer); + if (!sc->re_link) { ifq_purge(&ifp->if_snd); return; @@ -2095,6 +2104,8 @@ re_init(void *xsc) struct mii_data *mii; uint32_t rxcfg = 0; + ASSERT_SERIALIZED(ifp->if_serializer); + mii = device_get_softc(sc->re_miibus); /* @@ -2267,6 +2278,8 @@ re_ifmedia_upd(struct ifnet *ifp) struct re_softc *sc = ifp->if_softc; struct mii_data *mii; + ASSERT_SERIALIZED(ifp->if_serializer); + mii = device_get_softc(sc->re_miibus); mii_mediachg(mii); @@ -2282,6 +2295,8 @@ re_ifmedia_sts(struct ifnet *ifp, struct struct re_softc *sc = ifp->if_softc; struct mii_data *mii; + ASSERT_SERIALIZED(ifp->if_serializer); + mii = device_get_softc(sc->re_miibus); mii_pollstat(mii); @@ -2297,6 +2312,8 @@ re_ioctl(struct ifnet *ifp, u_long comma struct mii_data *mii; int error = 0; + ASSERT_SERIALIZED(ifp->if_serializer); + switch(command) { case SIOCSIFMTU: if (ifr->ifr_mtu > RE_JUMBO_MTU) @@ -2342,6 +2359,8 @@ re_watchdog(struct ifnet *ifp) { struct re_softc *sc = ifp->if_softc; + ASSERT_SERIALIZED(ifp->if_serializer); + if_printf(ifp, "watchdog timeout\n"); ifp->if_oerrors++; @@ -2365,6 +2384,8 @@ re_stop(struct re_softc *sc) struct ifnet *ifp = &sc->arpcom.ac_if; int i; + ASSERT_SERIALIZED(ifp->if_serializer); + ifp->if_timer = 0; callout_stop(&sc->re_timer); @@ -2412,6 +2433,9 @@ re_suspend(device_t dev) int i; #endif struct re_softc *sc = device_get_softc(dev); + struct ifnet *ifp = &sc->arpcom.ac_if; + + lwkt_serialize_enter(ifp->if_serializer); re_stop(sc); @@ -2426,6 +2450,8 @@ re_suspend(device_t dev) sc->suspended = 1; + lwkt_serialize_exit(ifp->if_serializer); + return (0); } @@ -2443,6 +2469,8 @@ re_resume(device_t dev) int i; #endif + lwkt_serialize_enter(ifp->if_serializer); + #ifndef BURN_BRIDGES /* better way to do this? */ for (i = 0; i < 5; i++) @@ -2463,6 +2491,8 @@ re_resume(device_t dev) sc->suspended = 0; + lwkt_serialize_exit(ifp->if_serializer); + return (0); }