diff options
| author | Oleg Bulyzhin <oleg@FreeBSD.org> | 2006-01-17 23:01:58 +0000 |
|---|---|---|
| committer | Oleg Bulyzhin <oleg@FreeBSD.org> | 2006-01-17 23:01:58 +0000 |
| commit | 6fb34dd2ede7217084d7d4667959e1c87dcadcc1 (patch) | |
| tree | 4ddd0896a0b8c943733002c4a38dae9743e63633 /sys/dev/bge | |
| parent | 853b7411b6f8ee4149f7e45507a2ae2038c33058 (diff) | |
Notes
Diffstat (limited to 'sys/dev/bge')
| -rw-r--r-- | sys/dev/bge/if_bge.c | 57 | ||||
| -rw-r--r-- | sys/dev/bge/if_bgereg.h | 3 |
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 */ |
