Module Name: src Committed By: msaitoh Date: Fri Jul 22 05:23:50 UTC 2022
Modified Files: src/sys/dev/pci: if_wm.c if_wmreg.h Log Message: Add more statistics countes. - Add many statics counters that the chip has. - Attach event counters only if available. To generate a diff of this commit: cvs rdiff -u -r1.745 -r1.746 src/sys/dev/pci/if_wm.c cvs rdiff -u -r1.126 -r1.127 src/sys/dev/pci/if_wmreg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_wm.c diff -u src/sys/dev/pci/if_wm.c:1.745 src/sys/dev/pci/if_wm.c:1.746 --- src/sys/dev/pci/if_wm.c:1.745 Tue Jul 19 08:22:34 2022 +++ src/sys/dev/pci/if_wm.c Fri Jul 22 05:23:50 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.745 2022/07/19 08:22:34 riastradh Exp $ */ +/* $NetBSD: if_wm.c,v 1.746 2022/07/22 05:23:50 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.745 2022/07/19 08:22:34 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.746 2022/07/22 05:23:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -595,12 +595,76 @@ struct wm_softc { /* Event counters. */ struct evcnt sc_ev_linkintr; /* Link interrupts */ - /* WM_T_82542_2_1 only */ + /* >= WM_T_82542_2_1 */ struct evcnt sc_ev_tx_xoff; /* Tx PAUSE(!0) frames */ struct evcnt sc_ev_tx_xon; /* Tx PAUSE(0) frames */ struct evcnt sc_ev_rx_xoff; /* Rx PAUSE(!0) frames */ struct evcnt sc_ev_rx_xon; /* Rx PAUSE(0) frames */ struct evcnt sc_ev_rx_macctl; /* Rx Unsupported */ + + struct evcnt sc_ev_crcerrs; /* CRC Error */ + struct evcnt sc_ev_algnerrc; /* Alignment Error */ + struct evcnt sc_ev_symerrc; /* Symbol Error */ + struct evcnt sc_ev_rxerrc; /* Receive Error */ + struct evcnt sc_ev_mpc; /* Missed Packets */ + struct evcnt sc_ev_colc; /* Collision */ + struct evcnt sc_ev_sec; /* Sequence Error */ + struct evcnt sc_ev_cexterr; /* Carrier Extension Error */ + struct evcnt sc_ev_rlec; /* Receive Length Error */ + struct evcnt sc_ev_scc; /* Single Collision */ + struct evcnt sc_ev_ecol; /* Excessive Collision */ + struct evcnt sc_ev_mcc; /* Multiple Collision */ + struct evcnt sc_ev_latecol; /* Late Collision */ + struct evcnt sc_ev_dc; /* Defer */ + struct evcnt sc_ev_gprc; /* Good Packets Rx */ + struct evcnt sc_ev_bprc; /* Broadcast Packets Rx */ + struct evcnt sc_ev_mprc; /* Multicast Packets Rx */ + struct evcnt sc_ev_gptc; /* Good Packets Tx */ + struct evcnt sc_ev_gorc; /* Good Octets Rx */ + struct evcnt sc_ev_gotc; /* Good Octets Tx */ + struct evcnt sc_ev_rnbc; /* Rx No Buffers */ + struct evcnt sc_ev_ruc; /* Rx Undersize */ + struct evcnt sc_ev_rfc; /* Rx Fragment */ + struct evcnt sc_ev_roc; /* Rx Oversize */ + struct evcnt sc_ev_rjc; /* Rx Jabber */ + struct evcnt sc_ev_tor; /* Total Octets Rx */ + struct evcnt sc_ev_tot; /* Total Octets Tx */ + struct evcnt sc_ev_tpr; /* Total Packets Rx */ + struct evcnt sc_ev_tpt; /* Total Packets Tx */ + struct evcnt sc_ev_mptc; /* Multicast Packets Tx */ + struct evcnt sc_ev_bptc; /* Broadcast Packets Tx Count */ + struct evcnt sc_ev_prc64; /* Packets Rx (64 bytes) */ + struct evcnt sc_ev_prc127; /* Packets Rx (65-127 bytes) */ + struct evcnt sc_ev_prc255; /* Packets Rx (128-255 bytes) */ + struct evcnt sc_ev_prc511; /* Packets Rx (255-511 bytes) */ + struct evcnt sc_ev_prc1023; /* Packets Rx (512-1023 bytes) */ + struct evcnt sc_ev_prc1522; /* Packets Rx (1024-1522 bytes) */ + struct evcnt sc_ev_ptc64; /* Packets Tx (64 bytes) */ + struct evcnt sc_ev_ptc127; /* Packets Tx (65-127 bytes) */ + struct evcnt sc_ev_ptc255; /* Packets Tx (128-255 bytes) */ + struct evcnt sc_ev_ptc511; /* Packets Tx (256-511 bytes) */ + struct evcnt sc_ev_ptc1023; /* Packets Tx (512-1023 bytes) */ + struct evcnt sc_ev_ptc1522; /* Packets Tx (1024-1522 Bytes) */ + struct evcnt sc_ev_iac; /* Interrupt Assertion */ + struct evcnt sc_ev_icrxptc; /* Intr. Cause Rx Pkt Timer Expire */ + struct evcnt sc_ev_icrxatc; /* Intr. Cause Rx Abs Timer Expire */ + struct evcnt sc_ev_ictxptc; /* Intr. Cause Tx Pkt Timer Expire */ + struct evcnt sc_ev_ictxact; /* Intr. Cause Tx Abs Timer Expire */ + struct evcnt sc_ev_ictxqec; /* Intr. Cause Tx Queue Empty */ + struct evcnt sc_ev_ictxqmtc; /* Intr. Cause Tx Queue Min Thresh */ + struct evcnt sc_ev_icrxdmtc; /* Intr. Cause Rx Desc Min Thresh */ + struct evcnt sc_ev_icrxoc; /* Intr. Cause Receiver Overrun */ + struct evcnt sc_ev_tncrs; /* Tx-No CRS */ + struct evcnt sc_ev_tsctc; /* TCP Segmentation Context Tx */ + struct evcnt sc_ev_tsctfc; /* TCP Segmentation Context Tx Fail */ + struct evcnt sc_ev_mgtprc; /* Management Packets RX */ + struct evcnt sc_ev_mgtpdc; /* Management Packets Dropped */ + struct evcnt sc_ev_mgtptc; /* Management Packets TX */ + struct evcnt sc_ev_b2ogprc; /* BMC2OS pkts received by host */ + struct evcnt sc_ev_o2bspc; /* OS2BMC pkts transmitted by host */ + struct evcnt sc_ev_b2ospc; /* BMC2OS pkts sent by BMC */ + struct evcnt sc_ev_o2bgptc; /* OS2BMC pkts received by BMC */ + #endif /* WM_EVENT_COUNTERS */ struct sysctllog *sc_sysctllog; @@ -3138,16 +3202,153 @@ alloc_retry: evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR, NULL, xname, "linkintr"); - evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC, - NULL, xname, "tx_xoff"); - evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC, - NULL, xname, "tx_xon"); - evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC, - NULL, xname, "rx_xoff"); - evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC, - NULL, xname, "rx_xon"); - evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC, - NULL, xname, "rx_macctl"); + if (sc->sc_type >= WM_T_82542_2_1) { + evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC, + NULL, xname, "tx_xoff"); + evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC, + NULL, xname, "tx_xon"); + evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC, + NULL, xname, "rx_xoff"); + evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC, + NULL, xname, "rx_xon"); + evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC, + NULL, xname, "rx_macctl"); + } + + evcnt_attach_dynamic(&sc->sc_ev_crcerrs, EVCNT_TYPE_MISC, + NULL, xname, "CRC Error"); + evcnt_attach_dynamic(&sc->sc_ev_symerrc, EVCNT_TYPE_MISC, + NULL, xname, "Symbol Error"); + + if (sc->sc_type >= WM_T_82543) { + evcnt_attach_dynamic(&sc->sc_ev_algnerrc, EVCNT_TYPE_MISC, + NULL, xname, "Alignment Error"); + evcnt_attach_dynamic(&sc->sc_ev_rxerrc, EVCNT_TYPE_MISC, + NULL, xname, "Receive Error"); + evcnt_attach_dynamic(&sc->sc_ev_cexterr, EVCNT_TYPE_MISC, + NULL, xname, "Carrier Extension Error"); + } + + evcnt_attach_dynamic(&sc->sc_ev_mpc, EVCNT_TYPE_MISC, + NULL, xname, "Missed Packets"); + evcnt_attach_dynamic(&sc->sc_ev_colc, EVCNT_TYPE_MISC, + NULL, xname, "Collision"); + evcnt_attach_dynamic(&sc->sc_ev_sec, EVCNT_TYPE_MISC, + NULL, xname, "Sequence Error"); + evcnt_attach_dynamic(&sc->sc_ev_rlec, EVCNT_TYPE_MISC, + NULL, xname, "Receive Length Error"); + evcnt_attach_dynamic(&sc->sc_ev_scc, EVCNT_TYPE_MISC, + NULL, xname, "Single Collision"); + evcnt_attach_dynamic(&sc->sc_ev_ecol, EVCNT_TYPE_MISC, + NULL, xname, "Excessive Collisions"); + evcnt_attach_dynamic(&sc->sc_ev_mcc, EVCNT_TYPE_MISC, + NULL, xname, "Multiple Collision"); + evcnt_attach_dynamic(&sc->sc_ev_latecol, EVCNT_TYPE_MISC, + NULL, xname, "Late Collisions"); + evcnt_attach_dynamic(&sc->sc_ev_dc, EVCNT_TYPE_MISC, + NULL, xname, "Defer"); + evcnt_attach_dynamic(&sc->sc_ev_gprc, EVCNT_TYPE_MISC, + NULL, xname, "Good Packets Rx"); + evcnt_attach_dynamic(&sc->sc_ev_bprc, EVCNT_TYPE_MISC, + NULL, xname, "Broadcast Packets Rx"); + evcnt_attach_dynamic(&sc->sc_ev_mprc, EVCNT_TYPE_MISC, + NULL, xname, "Multicast Packets Rx"); + evcnt_attach_dynamic(&sc->sc_ev_gptc, EVCNT_TYPE_MISC, + NULL, xname, "Good Packets Tx"); + evcnt_attach_dynamic(&sc->sc_ev_gorc, EVCNT_TYPE_MISC, + NULL, xname, "Good Octets Rx"); + evcnt_attach_dynamic(&sc->sc_ev_gotc, EVCNT_TYPE_MISC, + NULL, xname, "Good Octets Tx"); + evcnt_attach_dynamic(&sc->sc_ev_rnbc, EVCNT_TYPE_MISC, + NULL, xname, "Rx No Buffers"); + evcnt_attach_dynamic(&sc->sc_ev_ruc, EVCNT_TYPE_MISC, + NULL, xname, "Rx Undersize"); + evcnt_attach_dynamic(&sc->sc_ev_rfc, EVCNT_TYPE_MISC, + NULL, xname, "Rx Fragment"); + evcnt_attach_dynamic(&sc->sc_ev_roc, EVCNT_TYPE_MISC, + NULL, xname, "Rx Oversize"); + evcnt_attach_dynamic(&sc->sc_ev_rjc, EVCNT_TYPE_MISC, + NULL, xname, "Rx Jabber"); + evcnt_attach_dynamic(&sc->sc_ev_tor, EVCNT_TYPE_MISC, + NULL, xname, "Total Octets Rx"); + evcnt_attach_dynamic(&sc->sc_ev_tot, EVCNT_TYPE_MISC, + NULL, xname, "Total Octets Tx"); + evcnt_attach_dynamic(&sc->sc_ev_tpr, EVCNT_TYPE_MISC, + NULL, xname, "Total Packets Rx"); + evcnt_attach_dynamic(&sc->sc_ev_tpt, EVCNT_TYPE_MISC, + NULL, xname, "Total Packets Tx"); + evcnt_attach_dynamic(&sc->sc_ev_mptc, EVCNT_TYPE_MISC, + NULL, xname, "Multicast Packets Tx"); + evcnt_attach_dynamic(&sc->sc_ev_bptc, EVCNT_TYPE_MISC, + NULL, xname, "Broadcast Packets Tx Count"); + evcnt_attach_dynamic(&sc->sc_ev_prc64, EVCNT_TYPE_MISC, + NULL, xname, "Packets Rx (64 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_prc127, EVCNT_TYPE_MISC, + NULL, xname, "Packets Rx (65-127 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_prc255, EVCNT_TYPE_MISC, + NULL, xname, "Packets Rx (128-255 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_prc511, EVCNT_TYPE_MISC, + NULL, xname, "Packets Rx (255-511 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_prc1023, EVCNT_TYPE_MISC, + NULL, xname, "Packets Rx (512-1023 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_prc1522, EVCNT_TYPE_MISC, + NULL, xname, "Packets Rx (1024-1522 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_ptc64, EVCNT_TYPE_MISC, + NULL, xname, "Packets Tx (64 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_ptc127, EVCNT_TYPE_MISC, + NULL, xname, "Packets Tx (65-127 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_ptc255, EVCNT_TYPE_MISC, + NULL, xname, "Packets Tx (128-255 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_ptc511, EVCNT_TYPE_MISC, + NULL, xname, "Packets Tx (256-511 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_ptc1023, EVCNT_TYPE_MISC, + NULL, xname, "Packets Tx (512-1023 bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_ptc1522, EVCNT_TYPE_MISC, + NULL, xname, "Packets Tx (1024-1522 Bytes)"); + evcnt_attach_dynamic(&sc->sc_ev_iac, EVCNT_TYPE_MISC, + NULL, xname, "Interrupt Assertion"); + evcnt_attach_dynamic(&sc->sc_ev_icrxptc, EVCNT_TYPE_MISC, + NULL, xname, "Intr. Cause Rx Pkt Timer Expire"); + evcnt_attach_dynamic(&sc->sc_ev_icrxatc, EVCNT_TYPE_MISC, + NULL, xname, "Intr. Cause Rx Abs Timer Expire"); + evcnt_attach_dynamic(&sc->sc_ev_ictxptc, EVCNT_TYPE_MISC, + NULL, xname, "Intr. Cause Tx Pkt Timer Expire"); + evcnt_attach_dynamic(&sc->sc_ev_ictxact, EVCNT_TYPE_MISC, + NULL, xname, "Intr. Cause Tx Abs Timer Expire"); + evcnt_attach_dynamic(&sc->sc_ev_ictxqec, EVCNT_TYPE_MISC, + NULL, xname, "Intr. Cause Tx Queue Empty"); + evcnt_attach_dynamic(&sc->sc_ev_ictxqmtc, EVCNT_TYPE_MISC, + NULL, xname, "Intr. Cause Tx Queue Min Thresh"); + evcnt_attach_dynamic(&sc->sc_ev_icrxdmtc, EVCNT_TYPE_MISC, + NULL, xname, "Intr. Cause Rx Desc Min Thresh"); + evcnt_attach_dynamic(&sc->sc_ev_icrxoc, EVCNT_TYPE_MISC, + NULL, xname, "Interrupt Cause Receiver Overrun"); + if (sc->sc_type >= WM_T_82543) { + evcnt_attach_dynamic(&sc->sc_ev_tncrs, EVCNT_TYPE_MISC, + NULL, xname, "Tx with No CRS"); + evcnt_attach_dynamic(&sc->sc_ev_tsctc, EVCNT_TYPE_MISC, + NULL, xname, "TCP Segmentation Context Tx"); + evcnt_attach_dynamic(&sc->sc_ev_tsctfc, EVCNT_TYPE_MISC, + NULL, xname, "TCP Segmentation Context Tx Fail"); + } + if (sc->sc_type >= WM_T_82540) { + evcnt_attach_dynamic(&sc->sc_ev_mgtprc, EVCNT_TYPE_MISC, + NULL, xname, "Management Packets RX"); + evcnt_attach_dynamic(&sc->sc_ev_mgtpdc, EVCNT_TYPE_MISC, + NULL, xname, "Management Packets Dropped"); + evcnt_attach_dynamic(&sc->sc_ev_mgtptc, EVCNT_TYPE_MISC, + NULL, xname, "Management Packets TX"); + } + if ((sc->sc_type >= WM_T_I350) && (sc->sc_type < WM_T_80003)) { + evcnt_attach_dynamic(&sc->sc_ev_b2ogprc, EVCNT_TYPE_MISC, + NULL, xname, "BMC2OS Packets received by host"); + evcnt_attach_dynamic(&sc->sc_ev_o2bspc, EVCNT_TYPE_MISC, + NULL, xname, "OS2BMC Packets transmitted by host"); + evcnt_attach_dynamic(&sc->sc_ev_b2ospc, EVCNT_TYPE_MISC, + NULL, xname, "BMC2OS Packets sent by BMC"); + evcnt_attach_dynamic(&sc->sc_ev_o2bgptc, EVCNT_TYPE_MISC, + NULL, xname, "OS2BMC Packets received by BMC"); + } #endif /* WM_EVENT_COUNTERS */ sc->sc_txrx_use_workqueue = false; @@ -3192,11 +3393,85 @@ wm_detach(device_t self, int flags __unu #ifdef WM_EVENT_COUNTERS evcnt_detach(&sc->sc_ev_linkintr); - evcnt_detach(&sc->sc_ev_tx_xoff); - evcnt_detach(&sc->sc_ev_tx_xon); - evcnt_detach(&sc->sc_ev_rx_xoff); - evcnt_detach(&sc->sc_ev_rx_xon); - evcnt_detach(&sc->sc_ev_rx_macctl); + if (sc->sc_type >= WM_T_82542_2_1) { + evcnt_detach(&sc->sc_ev_tx_xoff); + evcnt_detach(&sc->sc_ev_tx_xon); + evcnt_detach(&sc->sc_ev_rx_xoff); + evcnt_detach(&sc->sc_ev_rx_xon); + evcnt_detach(&sc->sc_ev_rx_macctl); + } + + evcnt_detach(&sc->sc_ev_crcerrs); + evcnt_detach(&sc->sc_ev_symerrc); + + if (sc->sc_type >= WM_T_82543) { + evcnt_detach(&sc->sc_ev_algnerrc); + evcnt_detach(&sc->sc_ev_rxerrc); + evcnt_detach(&sc->sc_ev_cexterr); + } + evcnt_detach(&sc->sc_ev_mpc); + evcnt_detach(&sc->sc_ev_colc); + evcnt_detach(&sc->sc_ev_sec); + evcnt_detach(&sc->sc_ev_rlec); + evcnt_detach(&sc->sc_ev_scc); + evcnt_detach(&sc->sc_ev_ecol); + evcnt_detach(&sc->sc_ev_mcc); + evcnt_detach(&sc->sc_ev_latecol); + evcnt_detach(&sc->sc_ev_dc); + evcnt_detach(&sc->sc_ev_gprc); + evcnt_detach(&sc->sc_ev_bprc); + evcnt_detach(&sc->sc_ev_mprc); + evcnt_detach(&sc->sc_ev_gptc); + evcnt_detach(&sc->sc_ev_gorc); + evcnt_detach(&sc->sc_ev_gotc); + evcnt_detach(&sc->sc_ev_rnbc); + evcnt_detach(&sc->sc_ev_ruc); + evcnt_detach(&sc->sc_ev_rfc); + evcnt_detach(&sc->sc_ev_roc); + evcnt_detach(&sc->sc_ev_rjc); + evcnt_detach(&sc->sc_ev_tor); + evcnt_detach(&sc->sc_ev_tot); + evcnt_detach(&sc->sc_ev_tpr); + evcnt_detach(&sc->sc_ev_tpt); + evcnt_detach(&sc->sc_ev_mptc); + evcnt_detach(&sc->sc_ev_bptc); + evcnt_detach(&sc->sc_ev_prc64); + evcnt_detach(&sc->sc_ev_prc127); + evcnt_detach(&sc->sc_ev_prc255); + evcnt_detach(&sc->sc_ev_prc511); + evcnt_detach(&sc->sc_ev_prc1023); + evcnt_detach(&sc->sc_ev_prc1522); + evcnt_detach(&sc->sc_ev_ptc64); + evcnt_detach(&sc->sc_ev_ptc127); + evcnt_detach(&sc->sc_ev_ptc255); + evcnt_detach(&sc->sc_ev_ptc511); + evcnt_detach(&sc->sc_ev_ptc1023); + evcnt_detach(&sc->sc_ev_ptc1522); + evcnt_detach(&sc->sc_ev_iac); + evcnt_detach(&sc->sc_ev_icrxptc); + evcnt_detach(&sc->sc_ev_icrxatc); + evcnt_detach(&sc->sc_ev_ictxptc); + evcnt_detach(&sc->sc_ev_ictxact); + evcnt_detach(&sc->sc_ev_ictxqec); + evcnt_detach(&sc->sc_ev_ictxqmtc); + evcnt_detach(&sc->sc_ev_icrxdmtc); + evcnt_detach(&sc->sc_ev_icrxoc); + if (sc->sc_type >= WM_T_82543) { + evcnt_detach(&sc->sc_ev_tncrs); + evcnt_detach(&sc->sc_ev_tsctc); + evcnt_detach(&sc->sc_ev_tsctfc); + } + if (sc->sc_type >= WM_T_82540) { + evcnt_detach(&sc->sc_ev_mgtprc); + evcnt_detach(&sc->sc_ev_mgtpdc); + evcnt_detach(&sc->sc_ev_mgtptc); + } + if ((sc->sc_type >= WM_T_I350) && (sc->sc_type < WM_T_80003)) { + evcnt_detach(&sc->sc_ev_b2ogprc); + evcnt_detach(&sc->sc_ev_o2bspc); + evcnt_detach(&sc->sc_ev_b2ospc); + evcnt_detach(&sc->sc_ev_o2bgptc); + } #endif /* WM_EVENT_COUNTERS */ rnd_detach_source(&sc->rnd_source); @@ -3435,6 +3710,8 @@ 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; #ifndef WM_MPSAFE int s = splnet(); #endif @@ -3449,6 +3726,20 @@ 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_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)); @@ -3456,17 +3747,88 @@ wm_tick(void *arg) 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)); + WM_EVCNT_ADD(&sc->sc_ev_dc, CSR_READ(sc, WMREG_DC)); + 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) + CSR_READ(sc, WMREG_GORCH)); + WM_EVCNT_ADD(&sc->sc_ev_gotc, + CSR_READ(sc, WMREG_GOTCL) + CSR_READ(sc, WMREG_GOTCH)); + + 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)); + + WM_EVCNT_ADD(&sc->sc_ev_tor, + CSR_READ(sc, WMREG_TORL) + CSR_READ(sc, WMREG_TORH)); + WM_EVCNT_ADD(&sc->sc_ev_tot, + CSR_READ(sc, WMREG_TOTL) + CSR_READ(sc, WMREG_TOTH)); + + 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_mptc, CSR_READ(sc, WMREG_MPTC)); + WM_EVCNT_ADD(&sc->sc_ev_bptc, CSR_READ(sc, WMREG_BPTC)); + 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_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_iac, CSR_READ(sc, WMREG_IAC)); + 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_icrxdmtc, CSR_READ(sc, WMREG_ICRXDMTC)); + WM_EVCNT_ADD(&sc->sc_ev_icrxoc, CSR_READ(sc, WMREG_ICRXOC)); + if (sc->sc_type >= WM_T_82543) { + algnerrc = CSR_READ(sc, WMREG_ALGNERRC); + rxerrc = CSR_READ(sc, WMREG_RXERRC); + cexterr = CSR_READ(sc, WMREG_CEXTERR); + WM_EVCNT_ADD(&sc->sc_ev_algnerrc, algnerrc); + WM_EVCNT_ADD(&sc->sc_ev_rxerrc, rxerrc); + WM_EVCNT_ADD(&sc->sc_ev_cexterr, cexterr); + + WM_EVCNT_ADD(&sc->sc_ev_tncrs, CSR_READ(sc, WMREG_TNCRS)); + WM_EVCNT_ADD(&sc->sc_ev_tsctc, CSR_READ(sc, WMREG_TSCTC)); + WM_EVCNT_ADD(&sc->sc_ev_tsctfc, CSR_READ(sc, WMREG_TSCTFC)); + } else + algnerrc = rxerrc = cexterr = 0; + + 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)); + } + if (((sc->sc_type >= WM_T_I350) && (sc->sc_type < WM_T_80003)) + && ((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)); + } net_stat_ref_t nsr = IF_STAT_GETREF(ifp); - if_statadd_ref(nsr, if_collisions, CSR_READ(sc, WMREG_COLC)); - if_statadd_ref(nsr, if_ierrors, 0ULL /* ensure quad_t */ - + CSR_READ(sc, WMREG_CRCERRS) - + CSR_READ(sc, WMREG_ALGNERRC) - + CSR_READ(sc, WMREG_SYMERRC) - + CSR_READ(sc, WMREG_RXERRC) - + CSR_READ(sc, WMREG_SEC) - + CSR_READ(sc, WMREG_CEXTERR) - + CSR_READ(sc, WMREG_RLEC)); + 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 @@ -3476,7 +3838,7 @@ wm_tick(void *arg) * 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, CSR_READ(sc, WMREG_MPC)); + if_statadd_ref(nsr, if_iqdrops, mpc); IF_STAT_PUTREF(ifp); if (sc->sc_flags & WM_F_HAS_MII) Index: src/sys/dev/pci/if_wmreg.h diff -u src/sys/dev/pci/if_wmreg.h:1.126 src/sys/dev/pci/if_wmreg.h:1.127 --- src/sys/dev/pci/if_wmreg.h:1.126 Wed Jul 20 06:43:37 2022 +++ src/sys/dev/pci/if_wmreg.h Fri Jul 22 05:23:50 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wmreg.h,v 1.126 2022/07/20 06:43:37 msaitoh Exp $ */ +/* $NetBSD: if_wmreg.h,v 1.127 2022/07/22 05:23:50 msaitoh Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -1147,7 +1147,13 @@ struct livengood_tcpip_ctxdesc { #define WMREG_SYMERRC 0x4008 /* Symbol Error Count */ #define WMREG_RXERRC 0x400c /* Receive error Count - R/clr */ #define WMREG_MPC 0x4010 /* Missed Packets Count - R/clr */ +#define WMREG_SCC 0x4014 /* Single Collision Count - R/clr */ +#define WMREG_ECOL 0x4018 /* Excessive Collisions Count - R/clr */ +#define WMREG_MCC 0x401c /* Multiple Collision Count - R/clr */ +#define WMREG_LATECOL 0x4020 /* Late Collisions Count - R/clr */ #define WMREG_COLC 0x4028 /* Collision Count - R/clr */ +#define WMREG_DC 0x4030 /* Defer Count - R/clr */ +#define WMREG_TNCRS 0x4034 /* Tx with No CRS - R/clr */ #define WMREG_SEC 0x4038 /* Sequence Error Count */ #define WMREG_CEXTERR 0x403c /* Carrier Extension Error Count */ #define WMREG_RLEC 0x4040 /* Receive Length Error Count */ @@ -1156,9 +1162,57 @@ struct livengood_tcpip_ctxdesc { #define WMREG_XOFFRXC 0x4050 /* XOFF Rx Count - R/clr */ #define WMREG_XOFFTXC 0x4054 /* XOFF Tx Count - R/clr */ #define WMREG_FCRUC 0x4058 /* Flow Control Rx Unsupported Count - R/clr */ +#define WMREG_PRC64 0x405c /* Packets Rx (64 bytes) - R/clr */ +#define WMREG_PRC127 0x4060 /* Packets Rx (65-127 bytes) - R/clr */ +#define WMREG_PRC255 0x4064 /* Packets Rx (128-255 bytes) - R/clr */ +#define WMREG_PRC511 0x4068 /* Packets Rx (255-511 bytes) - R/clr */ +#define WMREG_PRC1023 0x406c /* Packets Rx (512-1023 bytes) - R/clr */ +#define WMREG_PRC1522 0x4070 /* Packets Rx (1024-1522 bytes) - R/clr */ +#define WMREG_GPRC 0x4074 /* Good Packets Rx Count - R/clr */ +#define WMREG_BPRC 0x4078 /* Broadcast Packets Rx Count - R/clr */ +#define WMREG_MPRC 0x407c /* Multicast Packets Rx Count - R/clr */ +#define WMREG_GPTC 0x4080 /* Good Packets Tx Count - R/clr */ +#define WMREG_GORCL 0x4088 /* Good Octets Rx Count Low - R/clr */ +#define WMREG_GORCH 0x408c /* Good Octets Rx Count High - R/clr */ +#define WMREG_GOTCL 0x4090 /* Good Octets Tx Count Low - R/clr */ +#define WMREG_GOTCH 0x4094 /* Good Octets Tx Count High - R/clr */ #define WMREG_RNBC 0x40a0 /* Receive No Buffers Count */ +#define WMREG_RUC 0x40a4 /* Rx Undersize Count - R/clr */ +#define WMREG_RFC 0x40a8 /* Rx Fragment Count - R/clr */ +#define WMREG_ROC 0x40ac /* Rx Oversize Count - R/clr */ +#define WMREG_RJC 0x40b0 /* Rx Jabber Count - R/clr */ +#define WMREG_MGTPRC 0x40b4 /* Management Packets RX Count - R/clr */ +#define WMREG_MGTPDC 0x40b8 /* Management Packets Dropped Count - R/clr */ +#define WMREG_MGTPTC 0x40bc /* Management Packets TX Count - R/clr */ +#define WMREG_TORL 0x40c0 /* Total Octets Rx Low - R/clr */ +#define WMREG_TORH 0x40c4 /* Total Octets Rx High - R/clr */ +#define WMREG_TOTL 0x40c8 /* Total Octets Tx Low - R/clr */ +#define WMREG_TOTH 0x40cc /* Total Octets Tx High - R/clr */ +#define WMREG_TPR 0x40d0 /* Total Packets Rx - R/clr */ +#define WMREG_TPT 0x40d4 /* Total Packets Tx - R/clr */ +#define WMREG_PTC64 0x40d8 /* Packets Tx (64 bytes) - R/clr */ +#define WMREG_PTC127 0x40dc /* Packets Tx (65-127 bytes) - R/clr */ +#define WMREG_PTC255 0x40e0 /* Packets Tx (128-255 bytes) - R/clr */ +#define WMREG_PTC511 0x40e4 /* Packets Tx (256-511 bytes) - R/clr */ +#define WMREG_PTC1023 0x40e8 /* Packets Tx (512-1023 bytes) - R/clr */ +#define WMREG_PTC1522 0x40ec /* Packets Tx (1024-1522 Bytes) - R/clr */ +#define WMREG_MPTC 0x40f0 /* Multicast Packets Tx Count - R/clr */ +#define WMREG_BPTC 0x40f4 /* Broadcast Packets Tx Count */ +#define WMREG_TSCTC 0x40f8 /* TCP Segmentation Context Tx */ +#define WMREG_TSCTFC 0x40fc /* TCP Segmentation Context Tx Fail */ +#define WMREG_IAC 0x4100 /* Interrupt Assertion Count */ +#define WMREG_ICRXPTC 0x4104 /* Interrupt Cause Rx Pkt Timer Expire Count */ +#define WMREG_ICRXATC 0x4108 /* Interrupt Cause Rx Abs Timer Expire Count */ +#define WMREG_ICTXPTC 0x410c /* Interrupt Cause Tx Pkt Timer Expire Count */ +#define WMREG_ICTXATC 0x4110 /* Interrupt Cause Tx Abs Timer Expire Count */ +#define WMREG_ICTXQEC 0x4118 /* Interrupt Cause Tx Queue Empty Count */ +#define WMREG_ICTXQMTC 0x411c /* Interrupt Cause Tx Queue Min Thresh Count */ +#define WMREG_ICRXDMTC 0x4120 /* Interrupt Cause Rx Desc Min Thresh Count */ +#define WMREG_ICRXOC 0x4124 /* Interrupt Cause Receiver Overrun Count */ #define WMREG_TLPIC 0x4148 /* EEE Tx LPI Count */ #define WMREG_RLPIC 0x414c /* EEE Rx LPI Count */ +#define WMREG_B2OGPRC 0x4158 /* BMC2OS packets received by host */ +#define WMREG_O2BSPC 0x415c /* OS2BMC packets transmitted by host */ #define WMREG_PCS_CFG 0x4200 /* PCS Configuration */ #define PCS_CFG_PCS_EN __BIT(3) @@ -1311,6 +1365,7 @@ struct livengood_tcpip_ctxdesc { #define MANC_RECV_ALL __BIT(19) #define MANC_EN_MAC_ADDR_FILTER __BIT(20) #define MANC_EN_MNG2HOST __BIT(21) +#define MANC_EN_BMC2OS __BIT(28) #define WMREG_MANC2H 0x5860 /* Management Control To Host - RW */ #define MANC2H_PORT_623 (1 << 5) @@ -1387,6 +1442,9 @@ struct livengood_tcpip_ctxdesc { #define WMREG_CRC_OFFSET 0x5f50 #define WMREG_PCH_RAICC(x) (WMREG_CRC_OFFSET + (x) * 4) +#define WMREG_B2OSPC 0x8fe0 /* BMC2OS packets sent by BMC */ +#define WMREG_O2BGPTC 0x8fe4 /* OS2BMC packets received by BMC */ + #define WMREG_EEC 0x12010 #define EEC_FLASH_DETECTED __BIT(19) /* FLASH */ #define EEC_FLUPD __BIT(23) /* Update FLASH */