Move statistics updating code from wm_tick() to new wm_update_stats().
- To reuse. - No functional change.
This commit is contained in:
parent
87132aa835
commit
ba8e082a6a
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: if_wm.c,v 1.776 2023/05/11 07:19:02 msaitoh Exp $ */
|
||||
/* $NetBSD: if_wm.c,v 1.777 2023/05/11 07:27:09 msaitoh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
|
||||
|
@ -82,7 +82,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.776 2023/05/11 07:19:02 msaitoh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.777 2023/05/11 07:27:09 msaitoh Exp $");
|
||||
|
||||
#ifdef _KERNEL_OPT
|
||||
#include "opt_if_wm.h"
|
||||
|
@ -884,6 +884,7 @@ static int wm_setup_msix(struct wm_softc *);
|
|||
static int wm_init(struct ifnet *);
|
||||
static int wm_init_locked(struct ifnet *);
|
||||
static void wm_init_sysctls(struct wm_softc *);
|
||||
static void wm_update_stats(struct wm_softc *);
|
||||
static void wm_unset_stopping_flags(struct wm_softc *);
|
||||
static void wm_set_stopping_flags(struct wm_softc *);
|
||||
static void wm_stop(struct ifnet *, int);
|
||||
|
@ -3881,8 +3882,6 @@ wm_tick(void *arg)
|
|||
{
|
||||
struct wm_softc *sc = arg;
|
||||
struct ifnet *ifp = &sc->sc_ethercom.ec_if;
|
||||
uint64_t crcerrs, algnerrc, symerrc, mpc, colc, sec, rlec, rxerrc,
|
||||
cexterr;
|
||||
|
||||
mutex_enter(sc->sc_core_lock);
|
||||
|
||||
|
@ -3891,180 +3890,7 @@ wm_tick(void *arg)
|
|||
return;
|
||||
}
|
||||
|
||||
crcerrs = CSR_READ(sc, WMREG_CRCERRS);
|
||||
symerrc = CSR_READ(sc, WMREG_SYMERRC);
|
||||
mpc = CSR_READ(sc, WMREG_MPC);
|
||||
colc = CSR_READ(sc, WMREG_COLC);
|
||||
sec = CSR_READ(sc, WMREG_SEC);
|
||||
rlec = CSR_READ(sc, WMREG_RLEC);
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_crcerrs, crcerrs);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_symerrc, symerrc);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mpc, mpc);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_colc, colc);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_sec, sec);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rlec, rlec);
|
||||
|
||||
if (sc->sc_type >= WM_T_82543) {
|
||||
algnerrc = CSR_READ(sc, WMREG_ALGNERRC);
|
||||
rxerrc = CSR_READ(sc, WMREG_RXERRC);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_algnerrc, algnerrc);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rxerrc, rxerrc);
|
||||
if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) {
|
||||
cexterr = CSR_READ(sc, WMREG_CEXTERR);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_cexterr, cexterr);
|
||||
} else {
|
||||
cexterr = 0;
|
||||
/* Excessive collision + Link down */
|
||||
WM_EVCNT_ADD(&sc->sc_ev_htdpmc,
|
||||
CSR_READ(sc, WMREG_HTDPMC));
|
||||
}
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tncrs, CSR_READ(sc, WMREG_TNCRS));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tsctc, CSR_READ(sc, WMREG_TSCTC));
|
||||
if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc))
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tsctfc,
|
||||
CSR_READ(sc, WMREG_TSCTFC));
|
||||
else {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_cbrmpc,
|
||||
CSR_READ(sc, WMREG_CBRMPC));
|
||||
}
|
||||
} else
|
||||
algnerrc = rxerrc = cexterr = 0;
|
||||
|
||||
if (sc->sc_type >= WM_T_82542_2_1) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC));
|
||||
}
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_scc, CSR_READ(sc, WMREG_SCC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ecol, CSR_READ(sc, WMREG_ECOL));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mcc, CSR_READ(sc, WMREG_MCC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_latecol, CSR_READ(sc, WMREG_LATECOL));
|
||||
|
||||
if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_cbtmpc, CSR_READ(sc, WMREG_CBTMPC));
|
||||
}
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_dc, CSR_READ(sc, WMREG_DC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc64, CSR_READ(sc, WMREG_PRC64));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc127, CSR_READ(sc, WMREG_PRC127));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc255, CSR_READ(sc, WMREG_PRC255));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc511, CSR_READ(sc, WMREG_PRC511));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc1023, CSR_READ(sc, WMREG_PRC1023));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc1522, CSR_READ(sc, WMREG_PRC1522));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_gprc, CSR_READ(sc, WMREG_GPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_bprc, CSR_READ(sc, WMREG_BPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mprc, CSR_READ(sc, WMREG_MPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_gptc, CSR_READ(sc, WMREG_GPTC));
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_gorc,
|
||||
CSR_READ(sc, WMREG_GORCL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_GORCH) << 32));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_gotc,
|
||||
CSR_READ(sc, WMREG_GOTCL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_GOTCH) << 32));
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rnbc, CSR_READ(sc, WMREG_RNBC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ruc, CSR_READ(sc, WMREG_RUC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rfc, CSR_READ(sc, WMREG_RFC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_roc, CSR_READ(sc, WMREG_ROC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rjc, CSR_READ(sc, WMREG_RJC));
|
||||
|
||||
if (sc->sc_type >= WM_T_82540) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mgtprc, CSR_READ(sc, WMREG_MGTPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mgtpdc, CSR_READ(sc, WMREG_MGTPDC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mgtptc, CSR_READ(sc, WMREG_MGTPTC));
|
||||
}
|
||||
|
||||
/*
|
||||
* The TOR(L) register includes:
|
||||
* - Error
|
||||
* - Flow control
|
||||
* - Broadcast rejected (This note is described in 82574 and newer
|
||||
* datasheets. What does "broadcast rejected" mean?)
|
||||
*/
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tor,
|
||||
CSR_READ(sc, WMREG_TORL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_TORH) << 32));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tot,
|
||||
CSR_READ(sc, WMREG_TOTL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_TOTH) << 32));
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tpr, CSR_READ(sc, WMREG_TPR));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tpt, CSR_READ(sc, WMREG_TPT));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc64, CSR_READ(sc, WMREG_PTC64));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc127, CSR_READ(sc, WMREG_PTC127));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc255, CSR_READ(sc, WMREG_PTC255));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc511, CSR_READ(sc, WMREG_PTC511));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc1023, CSR_READ(sc, WMREG_PTC1023));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc1522, CSR_READ(sc, WMREG_PTC1522));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mptc, CSR_READ(sc, WMREG_MPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_bptc, CSR_READ(sc, WMREG_BPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_iac, CSR_READ(sc, WMREG_IAC));
|
||||
if (sc->sc_type < WM_T_82575) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_icrxptc, CSR_READ(sc, WMREG_ICRXPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_icrxatc, CSR_READ(sc, WMREG_ICRXATC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ictxptc, CSR_READ(sc, WMREG_ICTXPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ictxact, CSR_READ(sc, WMREG_ICTXATC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ictxqec, CSR_READ(sc, WMREG_ICTXQEC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ictxqmtc,
|
||||
CSR_READ(sc, WMREG_ICTXQMTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rxdmtc,
|
||||
CSR_READ(sc, WMREG_ICRXDMTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_icrxoc, CSR_READ(sc, WMREG_ICRXOC));
|
||||
} else if (!WM_IS_ICHPCH(sc)) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rpthc, CSR_READ(sc, WMREG_RPTHC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_debug1, CSR_READ(sc, WMREG_DEBUG1));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_debug2, CSR_READ(sc, WMREG_DEBUG2));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_debug3, CSR_READ(sc, WMREG_DEBUG3));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_hgptc, CSR_READ(sc, WMREG_HGPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_debug4, CSR_READ(sc, WMREG_DEBUG4));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rxdmtc, CSR_READ(sc, WMREG_RXDMTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_htcbdpc, CSR_READ(sc, WMREG_HTCBDPC));
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_hgorc,
|
||||
CSR_READ(sc, WMREG_HGORCL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_HGORCH) << 32));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_hgotc,
|
||||
CSR_READ(sc, WMREG_HGOTCL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_HGOTCH) << 32));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_lenerrs, CSR_READ(sc, WMREG_LENERRS));
|
||||
}
|
||||
if ((sc->sc_type >= WM_T_I350) && (sc->sc_type < WM_T_80003)) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tlpic, CSR_READ(sc, WMREG_TLPIC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rlpic, CSR_READ(sc, WMREG_RLPIC));
|
||||
if ((CSR_READ(sc, WMREG_MANC) & MANC_EN_BMC2OS) != 0) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_b2ogprc,
|
||||
CSR_READ(sc, WMREG_B2OGPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_o2bspc,
|
||||
CSR_READ(sc, WMREG_O2BSPC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_b2ospc,
|
||||
CSR_READ(sc, WMREG_B2OSPC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_o2bgptc,
|
||||
CSR_READ(sc, WMREG_O2BGPTC));
|
||||
}
|
||||
WM_EVCNT_ADD(&sc->sc_ev_scvpc, CSR_READ(sc, WMREG_SCVPC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_hrmpc, CSR_READ(sc, WMREG_HRMPC));
|
||||
}
|
||||
net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
|
||||
if_statadd_ref(nsr, if_collisions, colc);
|
||||
if_statadd_ref(nsr, if_ierrors,
|
||||
crcerrs + algnerrc + symerrc + rxerrc + sec + cexterr + rlec);
|
||||
/*
|
||||
* WMREG_RNBC is incremented when there are no available buffers in
|
||||
* host memory. It does not mean the number of dropped packets, because
|
||||
* an Ethernet controller can receive packets in such case if there is
|
||||
* space in the phy's FIFO.
|
||||
*
|
||||
* If you want to know the nubmer of WMREG_RMBC, you should use such as
|
||||
* own EVCNT instead of if_iqdrops.
|
||||
*/
|
||||
if_statadd_ref(nsr, if_iqdrops, mpc);
|
||||
IF_STAT_PUTREF(ifp);
|
||||
wm_update_stats(sc);
|
||||
|
||||
if (sc->sc_flags & WM_F_HAS_MII)
|
||||
mii_tick(&sc->sc_mii);
|
||||
|
@ -6699,6 +6525,189 @@ err:
|
|||
__func__, rv);
|
||||
}
|
||||
|
||||
static void
|
||||
wm_update_stats(struct wm_softc *sc)
|
||||
{
|
||||
struct ifnet *ifp = &sc->sc_ethercom.ec_if;
|
||||
uint64_t crcerrs, algnerrc, symerrc, mpc, colc, sec, rlec, rxerrc,
|
||||
cexterr;
|
||||
|
||||
crcerrs = CSR_READ(sc, WMREG_CRCERRS);
|
||||
symerrc = CSR_READ(sc, WMREG_SYMERRC);
|
||||
mpc = CSR_READ(sc, WMREG_MPC);
|
||||
colc = CSR_READ(sc, WMREG_COLC);
|
||||
sec = CSR_READ(sc, WMREG_SEC);
|
||||
rlec = CSR_READ(sc, WMREG_RLEC);
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_crcerrs, crcerrs);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_symerrc, symerrc);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mpc, mpc);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_colc, colc);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_sec, sec);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rlec, rlec);
|
||||
|
||||
if (sc->sc_type >= WM_T_82543) {
|
||||
algnerrc = CSR_READ(sc, WMREG_ALGNERRC);
|
||||
rxerrc = CSR_READ(sc, WMREG_RXERRC);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_algnerrc, algnerrc);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rxerrc, rxerrc);
|
||||
if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc)) {
|
||||
cexterr = CSR_READ(sc, WMREG_CEXTERR);
|
||||
WM_EVCNT_ADD(&sc->sc_ev_cexterr, cexterr);
|
||||
} else {
|
||||
cexterr = 0;
|
||||
/* Excessive collision + Link down */
|
||||
WM_EVCNT_ADD(&sc->sc_ev_htdpmc,
|
||||
CSR_READ(sc, WMREG_HTDPMC));
|
||||
}
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tncrs, CSR_READ(sc, WMREG_TNCRS));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tsctc, CSR_READ(sc, WMREG_TSCTC));
|
||||
if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc))
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tsctfc,
|
||||
CSR_READ(sc, WMREG_TSCTFC));
|
||||
else {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_cbrmpc,
|
||||
CSR_READ(sc, WMREG_CBRMPC));
|
||||
}
|
||||
} else
|
||||
algnerrc = rxerrc = cexterr = 0;
|
||||
|
||||
if (sc->sc_type >= WM_T_82542_2_1) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC));
|
||||
}
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_scc, CSR_READ(sc, WMREG_SCC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ecol, CSR_READ(sc, WMREG_ECOL));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mcc, CSR_READ(sc, WMREG_MCC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_latecol, CSR_READ(sc, WMREG_LATECOL));
|
||||
|
||||
if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_cbtmpc, CSR_READ(sc, WMREG_CBTMPC));
|
||||
}
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_dc, CSR_READ(sc, WMREG_DC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc64, CSR_READ(sc, WMREG_PRC64));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc127, CSR_READ(sc, WMREG_PRC127));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc255, CSR_READ(sc, WMREG_PRC255));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc511, CSR_READ(sc, WMREG_PRC511));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc1023, CSR_READ(sc, WMREG_PRC1023));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_prc1522, CSR_READ(sc, WMREG_PRC1522));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_gprc, CSR_READ(sc, WMREG_GPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_bprc, CSR_READ(sc, WMREG_BPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mprc, CSR_READ(sc, WMREG_MPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_gptc, CSR_READ(sc, WMREG_GPTC));
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_gorc,
|
||||
CSR_READ(sc, WMREG_GORCL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_GORCH) << 32));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_gotc,
|
||||
CSR_READ(sc, WMREG_GOTCL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_GOTCH) << 32));
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rnbc, CSR_READ(sc, WMREG_RNBC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ruc, CSR_READ(sc, WMREG_RUC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rfc, CSR_READ(sc, WMREG_RFC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_roc, CSR_READ(sc, WMREG_ROC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rjc, CSR_READ(sc, WMREG_RJC));
|
||||
|
||||
if (sc->sc_type >= WM_T_82540) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mgtprc, CSR_READ(sc, WMREG_MGTPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mgtpdc, CSR_READ(sc, WMREG_MGTPDC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mgtptc, CSR_READ(sc, WMREG_MGTPTC));
|
||||
}
|
||||
|
||||
/*
|
||||
* The TOR(L) register includes:
|
||||
* - Error
|
||||
* - Flow control
|
||||
* - Broadcast rejected (This note is described in 82574 and newer
|
||||
* datasheets. What does "broadcast rejected" mean?)
|
||||
*/
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tor,
|
||||
CSR_READ(sc, WMREG_TORL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_TORH) << 32));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tot,
|
||||
CSR_READ(sc, WMREG_TOTL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_TOTH) << 32));
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tpr, CSR_READ(sc, WMREG_TPR));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tpt, CSR_READ(sc, WMREG_TPT));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc64, CSR_READ(sc, WMREG_PTC64));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc127, CSR_READ(sc, WMREG_PTC127));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc255, CSR_READ(sc, WMREG_PTC255));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc511, CSR_READ(sc, WMREG_PTC511));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc1023, CSR_READ(sc, WMREG_PTC1023));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ptc1522, CSR_READ(sc, WMREG_PTC1522));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_mptc, CSR_READ(sc, WMREG_MPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_bptc, CSR_READ(sc, WMREG_BPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_iac, CSR_READ(sc, WMREG_IAC));
|
||||
if (sc->sc_type < WM_T_82575) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_icrxptc, CSR_READ(sc, WMREG_ICRXPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_icrxatc, CSR_READ(sc, WMREG_ICRXATC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ictxptc, CSR_READ(sc, WMREG_ICTXPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ictxact, CSR_READ(sc, WMREG_ICTXATC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ictxqec, CSR_READ(sc, WMREG_ICTXQEC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_ictxqmtc,
|
||||
CSR_READ(sc, WMREG_ICTXQMTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rxdmtc,
|
||||
CSR_READ(sc, WMREG_ICRXDMTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_icrxoc, CSR_READ(sc, WMREG_ICRXOC));
|
||||
} else if (!WM_IS_ICHPCH(sc)) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rpthc, CSR_READ(sc, WMREG_RPTHC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_debug1, CSR_READ(sc, WMREG_DEBUG1));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_debug2, CSR_READ(sc, WMREG_DEBUG2));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_debug3, CSR_READ(sc, WMREG_DEBUG3));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_hgptc, CSR_READ(sc, WMREG_HGPTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_debug4, CSR_READ(sc, WMREG_DEBUG4));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rxdmtc, CSR_READ(sc, WMREG_RXDMTC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_htcbdpc, CSR_READ(sc, WMREG_HTCBDPC));
|
||||
|
||||
WM_EVCNT_ADD(&sc->sc_ev_hgorc,
|
||||
CSR_READ(sc, WMREG_HGORCL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_HGORCH) << 32));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_hgotc,
|
||||
CSR_READ(sc, WMREG_HGOTCL) +
|
||||
((uint64_t)CSR_READ(sc, WMREG_HGOTCH) << 32));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_lenerrs, CSR_READ(sc, WMREG_LENERRS));
|
||||
}
|
||||
if ((sc->sc_type >= WM_T_I350) && (sc->sc_type < WM_T_80003)) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_tlpic, CSR_READ(sc, WMREG_TLPIC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_rlpic, CSR_READ(sc, WMREG_RLPIC));
|
||||
if ((CSR_READ(sc, WMREG_MANC) & MANC_EN_BMC2OS) != 0) {
|
||||
WM_EVCNT_ADD(&sc->sc_ev_b2ogprc,
|
||||
CSR_READ(sc, WMREG_B2OGPRC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_o2bspc,
|
||||
CSR_READ(sc, WMREG_O2BSPC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_b2ospc,
|
||||
CSR_READ(sc, WMREG_B2OSPC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_o2bgptc,
|
||||
CSR_READ(sc, WMREG_O2BGPTC));
|
||||
}
|
||||
WM_EVCNT_ADD(&sc->sc_ev_scvpc, CSR_READ(sc, WMREG_SCVPC));
|
||||
WM_EVCNT_ADD(&sc->sc_ev_hrmpc, CSR_READ(sc, WMREG_HRMPC));
|
||||
}
|
||||
net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
|
||||
if_statadd_ref(nsr, if_collisions, colc);
|
||||
if_statadd_ref(nsr, if_ierrors,
|
||||
crcerrs + algnerrc + symerrc + rxerrc + sec + cexterr + rlec);
|
||||
/*
|
||||
* WMREG_RNBC is incremented when there are no available buffers in
|
||||
* host memory. It does not mean the number of dropped packets, because
|
||||
* an Ethernet controller can receive packets in such case if there is
|
||||
* space in the phy's FIFO.
|
||||
*
|
||||
* If you want to know the nubmer of WMREG_RMBC, you should use such as
|
||||
* own EVCNT instead of if_iqdrops.
|
||||
*/
|
||||
if_statadd_ref(nsr, if_iqdrops, mpc);
|
||||
IF_STAT_PUTREF(ifp);
|
||||
}
|
||||
|
||||
/*
|
||||
* wm_init: [ifnet interface function]
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue