aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/bge
diff options
context:
space:
mode:
authorOleg Bulyzhin <oleg@FreeBSD.org>2006-01-17 23:01:58 +0000
committerOleg Bulyzhin <oleg@FreeBSD.org>2006-01-17 23:01:58 +0000
commit6fb34dd2ede7217084d7d4667959e1c87dcadcc1 (patch)
tree4ddd0896a0b8c943733002c4a38dae9743e63633 /sys/dev/bge
parent853b7411b6f8ee4149f7e45507a2ae2038c33058 (diff)
Notes
Diffstat (limited to 'sys/dev/bge')
-rw-r--r--sys/dev/bge/if_bge.c57
-rw-r--r--sys/dev/bge/if_bgereg.h3
2 files changed, 32 insertions, 28 deletions
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
index 4c71b075c2686..d6b5d8813734f 100644
--- a/sys/dev/bge/if_bge.c
+++ b/sys/dev/bge/if_bge.c
@@ -2862,6 +2862,7 @@ bge_stats_update_regs(sc)
struct ifnet *ifp;
struct bge_mac_stats_regs stats;
u_int32_t *s;
+ u_long cnt; /* current register value */
int i;
ifp = sc->bge_ifp;
@@ -2872,14 +2873,13 @@ bge_stats_update_regs(sc)
s++;
}
- ifp->if_collisions +=
- (stats.dot3StatsSingleCollisionFrames +
- stats.dot3StatsMultipleCollisionFrames +
- stats.dot3StatsExcessiveCollisions +
- stats.dot3StatsLateCollisions) -
- ifp->if_collisions;
-
- return;
+ cnt = stats.dot3StatsSingleCollisionFrames +
+ stats.dot3StatsMultipleCollisionFrames +
+ stats.dot3StatsExcessiveCollisions +
+ stats.dot3StatsLateCollisions;
+ ifp->if_collisions += cnt >= sc->bge_tx_collisions ?
+ cnt - sc->bge_tx_collisions : cnt;
+ sc->bge_tx_collisions = cnt;
}
static void
@@ -2888,6 +2888,7 @@ bge_stats_update(sc)
{
struct ifnet *ifp;
bus_size_t stats;
+ u_long cnt; /* current register value */
ifp = sc->bge_ifp;
@@ -2896,29 +2897,29 @@ bge_stats_update(sc)
#define READ_STAT(sc, stats, stat) \
CSR_READ_4(sc, stats + offsetof(struct bge_stats, stat))
- ifp->if_collisions +=
- (READ_STAT(sc, stats,
- txstats.dot3StatsSingleCollisionFrames.bge_addr_lo) +
- READ_STAT(sc, stats,
- txstats.dot3StatsMultipleCollisionFrames.bge_addr_lo) +
- READ_STAT(sc, stats,
- txstats.dot3StatsExcessiveCollisions.bge_addr_lo) +
- READ_STAT(sc, stats,
- txstats.dot3StatsLateCollisions.bge_addr_lo)) -
- ifp->if_collisions;
+ cnt = READ_STAT(sc, stats,
+ txstats.dot3StatsSingleCollisionFrames.bge_addr_lo);
+ cnt += READ_STAT(sc, stats,
+ txstats.dot3StatsMultipleCollisionFrames.bge_addr_lo);
+ cnt += READ_STAT(sc, stats,
+ txstats.dot3StatsExcessiveCollisions.bge_addr_lo);
+ cnt += READ_STAT(sc, stats,
+ txstats.dot3StatsLateCollisions.bge_addr_lo);
+ ifp->if_collisions += cnt >= sc->bge_tx_collisions ?
+ cnt - sc->bge_tx_collisions : cnt;
+ sc->bge_tx_collisions = cnt;
-#undef READ_STAT
+ cnt = READ_STAT(sc, stats, ifInDiscards.bge_addr_lo);
+ ifp->if_ierrors += cnt >= sc->bge_rx_discards ?
+ cnt - sc->bge_rx_discards : cnt;
+ sc->bge_rx_discards = cnt;
-#ifdef notdef
- ifp->if_collisions +=
- (sc->bge_rdata->bge_info.bge_stats.dot3StatsSingleCollisionFrames +
- sc->bge_rdata->bge_info.bge_stats.dot3StatsMultipleCollisionFrames +
- sc->bge_rdata->bge_info.bge_stats.dot3StatsExcessiveCollisions +
- sc->bge_rdata->bge_info.bge_stats.dot3StatsLateCollisions) -
- ifp->if_collisions;
-#endif
+ cnt = READ_STAT(sc, stats, txstats.ifOutDiscards.bge_addr_lo);
+ ifp->if_oerrors += cnt >= sc->bge_tx_discards ?
+ cnt - sc->bge_tx_discards : cnt;
+ sc->bge_tx_discards = cnt;
- return;
+#undef READ_STAT
}
/*
diff --git a/sys/dev/bge/if_bgereg.h b/sys/dev/bge/if_bgereg.h
index 12fa607446861..d6d3153cf488c 100644
--- a/sys/dev/bge/if_bgereg.h
+++ b/sys/dev/bge/if_bgereg.h
@@ -2425,6 +2425,9 @@ struct bge_softc {
struct callout bge_stat_ch;
char *bge_vpd_prodname;
char *bge_vpd_readonly;
+ u_long bge_rx_discards;
+ u_long bge_tx_discards;
+ u_long bge_tx_collisions;
#ifdef DEVICE_POLLING
int rxcycles;
#endif /* DEVICE_POLLING */