svn commit: r272064 - head/sys/dev/et

Gleb Smirnoff glebius at FreeBSD.org
Wed Sep 24 11:23:56 UTC 2014


Author: glebius
Date: Wed Sep 24 11:23:55 2014
New Revision: 272064
URL: http://svnweb.freebsd.org/changeset/base/272064

Log:
  - Provide igb_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/et/if_et.c

Modified: head/sys/dev/et/if_et.c
==============================================================================
--- head/sys/dev/et/if_et.c	Wed Sep 24 09:59:48 2014	(r272063)
+++ head/sys/dev/et/if_et.c	Wed Sep 24 11:23:55 2014	(r272064)
@@ -104,6 +104,7 @@ static int	et_watchdog(struct et_softc *
 static int	et_ifmedia_upd_locked(struct ifnet *);
 static int	et_ifmedia_upd(struct ifnet *);
 static void	et_ifmedia_sts(struct ifnet *, struct ifmediareq *);
+static uint64_t	et_get_counter(struct ifnet *, ift_counter);
 
 static void	et_add_sysctls(struct et_softc *);
 static int	et_sysctl_rx_intr_npkts(SYSCTL_HANDLER_ARGS);
@@ -324,6 +325,7 @@ et_attach(device_t dev)
 	ifp->if_init = et_init;
 	ifp->if_ioctl = et_ioctl;
 	ifp->if_start = et_start;
+	ifp->if_get_counter = et_get_counter;
 	ifp->if_capabilities = IFCAP_TXCSUM | IFCAP_VLAN_MTU;
 	ifp->if_capenable = ifp->if_capabilities;
 	ifp->if_snd.ifq_drv_maxlen = ET_TX_NDESC - 1;
@@ -1413,7 +1415,7 @@ et_start_locked(struct ifnet *ifp)
 
 		if (et_encap(sc, &m_head)) {
 			if (m_head == NULL) {
-				ifp->if_oerrors++;
+				if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
 				break;
 			}
 			IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
@@ -1465,7 +1467,7 @@ et_watchdog(struct et_softc *sc)
 	if_printf(sc->ifp, "watchdog timed out (0x%08x) -- resetting\n",
 	    status);
 
-	sc->ifp->if_oerrors++;
+	if_inc_counter(sc->ifp, IFCOUNTER_OERRORS, 1);
 	sc->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 	et_init_locked(sc);
 	return (EJUSTRETURN);
@@ -2093,12 +2095,12 @@ et_rxeof(struct et_softc *sc)
 		CSR_WRITE_4(sc, ET_RXSTAT_POS, rxstat_pos);
 
 		if (ring_idx >= ET_RX_NRING) {
-			ifp->if_ierrors++;
+			if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
 			if_printf(ifp, "invalid ring index %d\n", ring_idx);
 			continue;
 		}
 		if (buf_idx >= ET_RX_NDESC) {
-			ifp->if_ierrors++;
+			if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
 			if_printf(ifp, "invalid buf index %d\n", buf_idx);
 			continue;
 		}
@@ -2110,13 +2112,13 @@ et_rxeof(struct et_softc *sc)
 			rbd->rbd_discard(rbd, buf_idx);
 		} else if (rbd->rbd_newbuf(rbd, buf_idx) != 0) {
 			/* No available mbufs, discard it. */
-			ifp->if_iqdrops++;
+			if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
 			rbd->rbd_discard(rbd, buf_idx);
 		} else {
 			buflen -= ETHER_CRC_LEN;
 			if (buflen < ETHER_HDR_LEN) {
 				m_freem(m);
-				ifp->if_ierrors++;
+				if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
 			} else {
 				m->m_pkthdr.len = m->m_len = buflen;
 				m->m_pkthdr.rcvif = ifp;
@@ -2625,7 +2627,6 @@ back:
 static void
 et_stats_update(struct et_softc *sc)
 {
-	struct ifnet *ifp;
 	struct et_hw_stats *stats;
 
 	stats = &sc->sc_stats;
@@ -2675,18 +2676,35 @@ et_stats_update(struct et_softc *sc)
 	stats->tx_oversize += CSR_READ_4(sc, ET_STAT_TX_OVERSIZE);
 	stats->tx_undersize += CSR_READ_4(sc, ET_STAT_TX_UNDERSIZE);
 	stats->tx_fragments += CSR_READ_4(sc, ET_STAT_TX_FRAG);
+}
 
-	/* Update ifnet counters. */
-	ifp = sc->ifp;
-	ifp->if_opackets = (u_long)stats->tx_frames;
-	ifp->if_collisions = stats->tx_total_colls;
-	ifp->if_oerrors = stats->tx_drop + stats->tx_jabbers +
-	    stats->tx_crcerrs + stats->tx_excess_deferred +
-	    stats->tx_late_colls;
-	ifp->if_ipackets = (u_long)stats->rx_frames;
-	ifp->if_ierrors = stats->rx_crcerrs + stats->rx_alignerrs +
-	    stats->rx_lenerrs + stats->rx_codeerrs + stats->rx_cserrs +
-	    stats->rx_runts + stats->rx_jabbers + stats->rx_drop;
+static uint64_t
+et_get_counter(struct ifnet *ifp, ift_counter cnt)
+{
+	struct et_softc *sc;
+	struct et_hw_stats *stats;
+
+	sc = if_getsoftc(ifp);
+	stats = &sc->sc_stats;
+
+	switch (cnt) {
+	case IFCOUNTER_OPACKETS:
+		return (stats->tx_frames);
+	case IFCOUNTER_COLLISIONS:
+		return (stats->tx_total_colls);
+	case IFCOUNTER_OERRORS:
+		return (stats->tx_drop + stats->tx_jabbers +
+		    stats->tx_crcerrs + stats->tx_excess_deferred +
+		    stats->tx_late_colls);
+	case IFCOUNTER_IPACKETS:
+		return (stats->rx_frames);
+	case IFCOUNTER_IERRORS:
+		return (stats->rx_crcerrs + stats->rx_alignerrs +
+		    stats->rx_lenerrs + stats->rx_codeerrs + stats->rx_cserrs +
+		    stats->rx_runts + stats->rx_jabbers + stats->rx_drop);
+	default:
+		return (if_get_counter_default(ifp, cnt));
+	}
 }
 
 static int


More information about the svn-src-all mailing list