Index: if_re.c =================================================================== RCS file: /home/ncvs/src/sys/dev/re/if_re.c,v retrieving revision 1.106 diff -u -r1.106 if_re.c --- if_re.c 3 Mar 2008 04:15:07 -0000 1.106 +++ if_re.c 7 Mar 2008 04:29:58 -0000 @@ -616,7 +616,27 @@ re_miibus_statchg(dev) device_t dev; { + struct rl_softc *sc; + struct mii_data *mii; + struct ifnet *ifp; + + sc = device_get_softc(dev); + mii = device_get_softc(sc->rl_miibus); + ifp = sc->rl_ifp; + if (mii == NULL || ifp == NULL || + (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; + if (mii->mii_media_status & IFM_AVALID) { + if (((mii->mii_media_status) & IFM_ACTIVE) == IFM_ACTIVE) + sc->rl_link = 1; + } else + sc->rl_link = 0; + + /* + * Stop/restarting MAC does not seem to be required as MAC + * lacks speed/duplex/flow-control configuration. + */ } /* @@ -1971,23 +1991,9 @@ RL_LOCK_ASSERT(sc); - re_watchdog(sc); - mii = device_get_softc(sc->rl_miibus); mii_tick(mii); - if (sc->rl_link) { - if (!(mii->mii_media_status & IFM_ACTIVE)) - sc->rl_link = 0; - } else { - if (mii->mii_media_status & IFM_ACTIVE && - IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { - sc->rl_link = 1; - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue_fast(taskqueue_fast, - &sc->rl_txtask); - } - } - + re_watchdog(sc); callout_reset(&sc->rl_stat_callout, hz, re_tick, sc); } @@ -2104,11 +2110,6 @@ re_init_locked(sc); } - if (status & RL_ISR_LINKCHG) { - callout_stop(&sc->rl_stat_callout); - re_tick(sc); - } - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_txtask); @@ -2239,12 +2240,19 @@ ((uint32_t)(*m_head)->m_pkthdr.tso_segsz << RL_TDESC_CMD_MSSVAL_SHIFT); else { - if ((*m_head)->m_pkthdr.csum_flags & CSUM_IP) + if ((*m_head)->m_pkthdr.csum_flags & RE_CSUM_FEATURES) { + /* + * Always set IP checksum offload if either TCP + * or UDP checksum offload is requested, otherwise + * TCP/UDP checksum offload does not work under + * certain circumstances. + */ csum_flags |= RL_TDESC_CMD_IPCSUM; - if ((*m_head)->m_pkthdr.csum_flags & CSUM_TCP) - csum_flags |= RL_TDESC_CMD_TCPCSUM; - if ((*m_head)->m_pkthdr.csum_flags & CSUM_UDP) - csum_flags |= RL_TDESC_CMD_UDPCSUM; + if ((*m_head)->m_pkthdr.csum_flags & CSUM_TCP) + csum_flags |= RL_TDESC_CMD_TCPCSUM; + if ((*m_head)->m_pkthdr.csum_flags & CSUM_UDP) + csum_flags |= RL_TDESC_CMD_UDPCSUM; + } } si = prod; @@ -2587,14 +2595,15 @@ { struct rl_softc *sc; struct mii_data *mii; + int error; sc = ifp->if_softc; mii = device_get_softc(sc->rl_miibus); RL_LOCK(sc); - mii_mediachg(mii); + error = mii_mediachg(mii); RL_UNLOCK(sc); - return (0); + return (error); } /*