svn commit: r272067 - head/sys/dev/txp
Gleb Smirnoff
glebius at FreeBSD.org
Wed Sep 24 11:58:24 UTC 2014
Author: glebius
Date: Wed Sep 24 11:58:23 2014
New Revision: 272067
URL: http://svnweb.freebsd.org/changeset/base/272067
Log:
- Provide txp_get_counter() to return counters that are not collected,
but taken from hardware.
- Mechanically convert to if_inc_counter() the rest of counters.
Modified:
head/sys/dev/txp/if_txp.c
Modified: head/sys/dev/txp/if_txp.c
==============================================================================
--- head/sys/dev/txp/if_txp.c Wed Sep 24 11:33:43 2014 (r272066)
+++ head/sys/dev/txp/if_txp.c Wed Sep 24 11:58:23 2014 (r272067)
@@ -149,6 +149,7 @@ static int txp_intr(void *);
static void txp_int_task(void *, int);
static void txp_tick(void *);
static int txp_ioctl(struct ifnet *, u_long, caddr_t);
+static uint64_t txp_get_counter(struct ifnet *, ift_counter);
static void txp_start(struct ifnet *);
static void txp_start_locked(struct ifnet *);
static int txp_encap(struct txp_softc *, struct txp_tx_ring *, struct mbuf **);
@@ -413,6 +414,7 @@ txp_attach(device_t dev)
ifp->if_ioctl = txp_ioctl;
ifp->if_start = txp_start;
ifp->if_init = txp_init;
+ ifp->if_get_counter = txp_get_counter;
ifp->if_snd.ifq_drv_maxlen = TX_ENTRIES - 1;
IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
IFQ_SET_READY(&ifp->if_snd);
@@ -2540,7 +2542,7 @@ txp_watchdog(struct txp_softc *sc)
ifp = sc->sc_ifp;
if_printf(ifp, "watchdog timeout -- resetting\n");
- ifp->if_oerrors++;
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
txp_stop(sc);
txp_init_locked(sc);
}
@@ -2816,13 +2818,11 @@ out:
static void
txp_stats_update(struct txp_softc *sc, struct txp_rsp_desc *rsp)
{
- struct ifnet *ifp;
struct txp_hw_stats *ostats, *stats;
struct txp_ext_desc *ext;
TXP_LOCK_ASSERT(sc);
- ifp = sc->sc_ifp;
ext = (struct txp_ext_desc *)(rsp + 1);
ostats = &sc->sc_ostats;
stats = &sc->sc_stats;
@@ -2856,15 +2856,34 @@ txp_stats_update(struct txp_softc *sc, s
le32toh(ext[4].ext_3);
stats->rx_oflows = ostats->rx_oflows + le32toh(ext[4].ext_4);
stats->rx_filtered = ostats->rx_filtered + le32toh(ext[5].ext_1);
+}
- ifp->if_ierrors = stats->rx_fifo_oflows + stats->rx_badssd +
- stats->rx_crcerrs + stats->rx_lenerrs + stats->rx_oflows;
- ifp->if_oerrors = stats->tx_deferred + stats->tx_carrier_lost +
- stats->tx_fifo_underruns + stats->tx_mcast_oflows;
- ifp->if_collisions = stats->tx_late_colls + stats->tx_multi_colls +
- stats->tx_excess_colls;
- ifp->if_opackets = stats->tx_frames;
- ifp->if_ipackets = stats->rx_frames;
+static uint64_t
+txp_get_counter(struct ifnet *ifp, ift_counter cnt)
+{
+ struct txp_softc *sc;
+ struct txp_hw_stats *stats;
+
+ sc = if_getsoftc(ifp);
+ stats = &sc->sc_stats;
+
+ switch (cnt) {
+ case IFCOUNTER_IERRORS:
+ return (stats->rx_fifo_oflows + stats->rx_badssd +
+ stats->rx_crcerrs + stats->rx_lenerrs + stats->rx_oflows);
+ case IFCOUNTER_OERRORS:
+ return (stats->tx_deferred + stats->tx_carrier_lost +
+ stats->tx_fifo_underruns + stats->tx_mcast_oflows);
+ case IFCOUNTER_COLLISIONS:
+ return (stats->tx_late_colls + stats->tx_multi_colls +
+ stats->tx_excess_colls);
+ case IFCOUNTER_OPACKETS:
+ return (stats->tx_frames);
+ case IFCOUNTER_IPACKETS:
+ return (stats->rx_frames);
+ default:
+ return (if_get_counter_default(ifp, cnt));
+ }
}
#define TXP_SYSCTL_STAT_ADD32(c, h, n, p, d) \
More information about the svn-src-head
mailing list