diff options
author | jhb <jhb@FreeBSD.org> | 2009-11-17 14:13:30 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2009-11-17 14:13:30 +0000 |
commit | 4d92e278180b89aada1affefb8281eb78bd5e5d3 (patch) | |
tree | 8da5dc0e03d5bcc99c3767d095d9ed326f055c3e /sys/dev/de | |
parent | d0a2f156676bf57453eddc2bd818d340bb1c5b14 (diff) | |
download | FreeBSD-src-4d92e278180b89aada1affefb8281eb78bd5e5d3.zip FreeBSD-src-4d92e278180b89aada1affefb8281eb78bd5e5d3.tar.gz |
Use a private timer to run the statistics timer instead of (ab)using
if_watchdog and if_timer.
Tested by: WATANABE Kazuhiro CQG00620 of nifty.ne.jp
Diffstat (limited to 'sys/dev/de')
-rw-r--r-- | sys/dev/de/if_de.c | 30 | ||||
-rw-r--r-- | sys/dev/de/if_devar.h | 5 |
2 files changed, 15 insertions, 20 deletions
diff --git a/sys/dev/de/if_de.c b/sys/dev/de/if_de.c index c3d2839..b785fe4 100644 --- a/sys/dev/de/if_de.c +++ b/sys/dev/de/if_de.c @@ -151,6 +151,7 @@ static void tulip_start_locked(tulip_softc_t * const sc); static struct mbuf * tulip_txput(tulip_softc_t * const sc, struct mbuf *m); static void tulip_txput_setup(tulip_softc_t * const sc); +static void tulip_watchdog(void *arg); struct mbuf * tulip_dequeue_mbuf(tulip_ringinfo_t *ri, tulip_descinfo_t *di, int sync); static void tulip_dma_map_addr(void *, bus_dma_segment_t *, int, int); @@ -3302,11 +3303,13 @@ tulip_init_locked(tulip_softc_t * const sc) TULIP_CSR_READ(sc, csr_status)); if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == TULIP_WANTSETUP) tulip_txput_setup(sc); + callout_reset(&sc->tulip_stat_timer, hz, tulip_watchdog, sc); } else { CTR0(KTR_TULIP, "tulip_init_locked: not up, reset chip"); sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_RUNNING; tulip_reset(sc); tulip_addr_filter(sc); + callout_stop(&sc->tulip_stat_timer); } } @@ -4319,23 +4322,17 @@ tulip_start_locked(tulip_softc_t * const sc) } } -/* - * Even though this routine runs at device spl, it does not break - * our use of splnet (splsoftnet under NetBSD) for the majority - * of this driver since - * if_watcbog is called from if_watchdog which is called from - * splsoftclock which is below spl[soft]net. - */ static void -tulip_ifwatchdog(struct ifnet *ifp) +tulip_watchdog(void *arg) { - TULIP_PERFSTART(ifwatchdog) - tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc; + TULIP_PERFSTART(stat) + tulip_softc_t *sc = arg; #if defined(TULIP_DEBUG) u_int32_t rxintrs; #endif - TULIP_LOCK(sc); + TULIP_LOCK_ASSERT(sc); + callout_reset(&sc->tulip_stat_timer, hz, tulip_watchdog, sc); #if defined(TULIP_DEBUG) rxintrs = sc->tulip_dbg.dbg_rxintrs - sc->tulip_dbg.dbg_last_rxintrs; if (rxintrs > sc->tulip_dbg.dbg_high_rxintrs_hz) @@ -4343,7 +4340,6 @@ tulip_ifwatchdog(struct ifnet *ifp) sc->tulip_dbg.dbg_last_rxintrs = sc->tulip_dbg.dbg_rxintrs; #endif /* TULIP_DEBUG */ - sc->tulip_ifp->if_timer = 1; /* * These should be rare so do a bulk test up front so we can just skip * them if needed. @@ -4381,11 +4377,11 @@ tulip_ifwatchdog(struct ifnet *ifp) tulip_init_locked(sc); } - TULIP_PERFEND(ifwatchdog); + TULIP_PERFEND(stat); TULIP_PERFMERGE(sc, perf_intr_cycles); TULIP_PERFMERGE(sc, perf_ifstart_cycles); TULIP_PERFMERGE(sc, perf_ifioctl_cycles); - TULIP_PERFMERGE(sc, perf_ifwatchdog_cycles); + TULIP_PERFMERGE(sc, perf_stat_cycles); TULIP_PERFMERGE(sc, perf_timeout_cycles); TULIP_PERFMERGE(sc, perf_ifstart_one_cycles); TULIP_PERFMERGE(sc, perf_txput_cycles); @@ -4395,14 +4391,13 @@ tulip_ifwatchdog(struct ifnet *ifp) TULIP_PERFMERGE(sc, perf_intr); TULIP_PERFMERGE(sc, perf_ifstart); TULIP_PERFMERGE(sc, perf_ifioctl); - TULIP_PERFMERGE(sc, perf_ifwatchdog); + TULIP_PERFMERGE(sc, perf_stat); TULIP_PERFMERGE(sc, perf_timeout); TULIP_PERFMERGE(sc, perf_ifstart_one); TULIP_PERFMERGE(sc, perf_txput); TULIP_PERFMERGE(sc, perf_txintr); TULIP_PERFMERGE(sc, perf_rxintr); TULIP_PERFMERGE(sc, perf_rxget); - TULIP_UNLOCK(sc); } static void @@ -4418,8 +4413,6 @@ tulip_attach(tulip_softc_t * const sc) ifp->if_flags = IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST; ifp->if_ioctl = tulip_ifioctl; ifp->if_start = tulip_start; - ifp->if_watchdog = tulip_ifwatchdog; - ifp->if_timer = 1; ifp->if_init = tulip_init; IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; @@ -4839,6 +4832,7 @@ tulip_pci_attach(device_t dev) mtx_init(TULIP_MUTEX(sc), MTX_NETWORK_LOCK, device_get_nameunit(dev), MTX_DEF); callout_init_mtx(&sc->tulip_callout, TULIP_MUTEX(sc), 0); + callout_init_mtx(&sc->tulip_stat_timer, TULIP_MUTEX(sc), 0); tulips[unit] = sc; tulip_initcsrs(sc, csr_base + csroffset, csrsize); diff --git a/sys/dev/de/if_devar.h b/sys/dev/de/if_devar.h index b4feebc..8776be0 100644 --- a/sys/dev/de/if_devar.h +++ b/sys/dev/de/if_devar.h @@ -477,7 +477,7 @@ struct tulip_perfstat { u_quad_t perf_ifstart_cycles; u_quad_t perf_ifstart_one_cycles; u_quad_t perf_ifioctl_cycles; - u_quad_t perf_ifwatchdog_cycles; + u_quad_t perf_stat_cycles; u_quad_t perf_timeout_cycles; u_quad_t perf_txput_cycles; u_quad_t perf_txintr_cycles; @@ -487,7 +487,7 @@ struct tulip_perfstat { unsigned int perf_ifstart; unsigned int perf_ifstart_one; unsigned int perf_ifioctl; - unsigned int perf_ifwatchdog; + unsigned int perf_stat; unsigned int perf_timeout; unsigned int perf_txput; unsigned int perf_txintr; @@ -570,6 +570,7 @@ struct tulip_softc { tulip_srom_connection_t tulip_conntype; struct callout tulip_callout; struct mtx tulip_mutex; + struct callout tulip_stat_timer; }; #define tulip_curperfstats tulip_perfstats[TULIP_PERF_CURRENT] |