Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci Some statistics registers were replaced with new...



details:   https://anonhg.NetBSD.org/src/rev/71bdc27a765e
branches:  trunk
changeset: 374742:71bdc27a765e
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Thu May 11 07:14:46 2023 +0000

description:
Some statistics registers were replaced with new counters.

 - 0x403c was CEXTERR(Carrier Extension Error). 82575 and newer except 80003,
   ICHs and PCHs have HTDPMC(Host Tx Discarded Packets by MAC). I don't really
   know for 82575. The 82575 datasheet say nothing about it.
 - The following two are changed for circuit breaker. Only 82576's datasheet
   describes abut it, so the registers might be only for 82576.
   Use those registers for 82575 and newer except 80003, ICHs and PCHs just in
   case.
   - 0x40fc was TSCTFC(TCP Segmentation Context Tx Fail). It was replaced by
     the CBRMPC(Circuit Breaker Rx Manageability Packet) register.
   - 0x4124 was ICRXOC(Interrupt Cause Receiver Overrun). It was replaced by
     the HTCBDPC(Host Tx Circuit Breaker Dropped Packet) register.
 - From 0x4104 to 0x4124:
   - For 0x4124, 82575's datasheet says it's not changed(ICRXOC).
     I don't know if it's correct. We use new HTCBDPC register for 82575.
   - 82576 and newer changed the meaning.
   - I don't know for 80003, ICHs and PCHs. Don't count those registers.
     At least, those registers in PCH2 and PCH_CNP are all zero.

diffstat:

 sys/dev/pci/if_wm.c    |  144 +++++++++++++++++++++++++++++++++++++++++++-----
 sys/dev/pci/if_wmreg.h |   24 +++++++-
 sys/dev/pci/if_wmvar.h |    5 +-
 3 files changed, 155 insertions(+), 18 deletions(-)

diffs (truncated from 322 to 300 lines):

diff -r f2a3361d3915 -r 71bdc27a765e sys/dev/pci/if_wm.c
--- a/sys/dev/pci/if_wm.c       Thu May 11 07:08:47 2023 +0000
+++ b/sys/dev/pci/if_wm.c       Thu May 11 07:14:46 2023 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_wm.c,v 1.774 2023/05/11 07:08:47 msaitoh Exp $      */
+/*     $NetBSD: if_wm.c,v 1.775 2023/05/11 07:14:46 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.774 2023/05/11 07:08:47 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.775 2023/05/11 07:14:46 msaitoh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_if_wm.h"
@@ -604,7 +604,12 @@ struct wm_softc {
        struct evcnt sc_ev_dc;          /* Defer */
        struct evcnt sc_ev_tncrs;       /* Tx-No CRS */
        struct evcnt sc_ev_sec;         /* Sequence Error */
+
+       /* Old */
        struct evcnt sc_ev_cexterr;     /* Carrier Extension Error */
+       /* New */
+       struct evcnt sc_ev_htdpmc;      /* Host Tx Discarded Pkts by MAC */
+
        struct evcnt sc_ev_rlec;        /* Receive Length Error */
        struct evcnt sc_ev_prc64;       /* Packets Rx (64 bytes) */
        struct evcnt sc_ev_prc127;      /* Packets Rx (65-127 bytes) */
@@ -639,16 +644,36 @@ struct wm_softc {
        struct evcnt sc_ev_mptc;        /* Multicast Packets Tx */
        struct evcnt sc_ev_bptc;        /* Broadcast Packets Tx */
        struct evcnt sc_ev_tsctc;       /* TCP Segmentation Context Tx */
+
+       /* Old */
        struct evcnt sc_ev_tsctfc;      /* TCP Segmentation Context Tx Fail */
+       /* New */
+       struct evcnt sc_ev_cbrmpc;      /* Circuit Breaker Rx Mng. Packet */
+
        struct evcnt sc_ev_iac;         /* Interrupt Assertion */
+
+       /* Old */
        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 */
+       /*
+        * sc_ev_rxdmtc is shared with both "Intr. cause" and
+        * non "Intr. cause" register.
+        */
+       struct evcnt sc_ev_rxdmtc;      /* (Intr. Cause) Rx Desc Min Thresh */
        struct evcnt sc_ev_icrxoc;      /* Intr. Cause Receiver Overrun */
+       /* New */
+       struct evcnt sc_ev_rpthc;       /* Rx Packets To Host */
+       struct evcnt sc_ev_debug1;      /* Debug Counter 1 */
+       struct evcnt sc_ev_debug2;      /* Debug Counter 2 */
+       struct evcnt sc_ev_debug3;      /* Debug Counter 3 */
+       struct evcnt sc_ev_hgptc;       /* Host Good Packets TX */
+       struct evcnt sc_ev_debug4;      /* Debug Counter 4 */
+       struct evcnt sc_ev_htcbdpc;     /* Host Tx Circuit Breaker Drp. Pkts */
+
        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 */
@@ -3217,15 +3242,30 @@ alloc_retry:
                    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");
+               /* XXX Does 82575 have HTDPMC? */
+               if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc))
+                       evcnt_attach_dynamic(&sc->sc_ev_cexterr,
+                           EVCNT_TYPE_MISC, NULL, xname,
+                           "Carrier Extension Error");
+               else
+                       evcnt_attach_dynamic(&sc->sc_ev_htdpmc,
+                           EVCNT_TYPE_MISC, NULL, xname,
+                           "Host Transmit Discarded Packets by MAC");
 
                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_82575) || WM_IS_ICHPCH(sc))
+                       evcnt_attach_dynamic(&sc->sc_ev_tsctfc,
+                           EVCNT_TYPE_MISC, NULL, xname,
+                           "TCP Segmentation Context Tx Fail");
+               else {
+                       /* XXX Is the circuit breaker only for 82576? */
+                       evcnt_attach_dynamic(&sc->sc_ev_cbrmpc,
+                           EVCNT_TYPE_MISC, NULL, xname,
+                           "Circuit Breaker Rx Manageability Packet");
+               }
        }
 
        if (sc->sc_type >= WM_T_82542_2_1) {
@@ -3332,10 +3372,45 @@ alloc_retry:
                    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,
+               evcnt_attach_dynamic(&sc->sc_ev_rxdmtc, EVCNT_TYPE_MISC,
                    NULL, xname, "Intr. Cause Rx Desc Min Thresh");
+
+               /* XXX 82575 document says it has ICRXOC. Is that right? */
                evcnt_attach_dynamic(&sc->sc_ev_icrxoc, EVCNT_TYPE_MISC,
                    NULL, xname, "Interrupt Cause Receiver Overrun");
+       } else if (!WM_IS_ICHPCH(sc)) {
+               /*
+                * For 82575 and newer.
+                *
+                * On 80003, ICHs and PCHs, it seems all of the following
+                * registers are zero.
+                */
+               evcnt_attach_dynamic(&sc->sc_ev_rpthc, EVCNT_TYPE_MISC,
+                   NULL, xname, "Rx Packets To Host");
+               evcnt_attach_dynamic(&sc->sc_ev_debug1, EVCNT_TYPE_MISC,
+                   NULL, xname, "Debug Counter 1");
+               evcnt_attach_dynamic(&sc->sc_ev_debug2, EVCNT_TYPE_MISC,
+                   NULL, xname, "Debug Counter 2");
+               evcnt_attach_dynamic(&sc->sc_ev_debug3, EVCNT_TYPE_MISC,
+                   NULL, xname, "Debug Counter 3");
+
+               /*
+                * 82575 datasheet says 0x4118 is for TXQEC(Tx Queue Empty).
+                * I think it's wrong. The real count I observed is the same
+                * as GPTC(Good Packets Tx) and TPT(Total Packets Tx).
+                * It's HGPTC(Host Good Packets Tx) which is described in
+                * 82576's datasheet.
+                */
+               evcnt_attach_dynamic(&sc->sc_ev_hgptc, EVCNT_TYPE_MISC,
+                   NULL, xname, "Host Good Packets TX");
+
+               evcnt_attach_dynamic(&sc->sc_ev_debug4, EVCNT_TYPE_MISC,
+                   NULL, xname, "Debug Counter 4");
+               evcnt_attach_dynamic(&sc->sc_ev_rxdmtc, EVCNT_TYPE_MISC,
+                   NULL, xname, "Rx Desc Min Thresh");
+               /* XXX Is the circuit breaker only for 82576? */
+               evcnt_attach_dynamic(&sc->sc_ev_htcbdpc, EVCNT_TYPE_MISC,
+                   NULL, xname, "Host Tx Circuit Breaker Dropped Packets");
        }
        if ((sc->sc_type >= WM_T_I350) && (sc->sc_type < WM_T_80003)) {
                evcnt_attach_dynamic(&sc->sc_ev_b2ogprc, EVCNT_TYPE_MISC,
@@ -3404,11 +3479,17 @@ wm_detach(device_t self, int flags __unu
        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);
+               if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc))
+                       evcnt_detach(&sc->sc_ev_cexterr);
+               else
+                       evcnt_detach(&sc->sc_ev_htdpmc);
 
                evcnt_detach(&sc->sc_ev_tncrs);
                evcnt_detach(&sc->sc_ev_tsctc);
-               evcnt_detach(&sc->sc_ev_tsctfc);
+               if ((sc->sc_type < WM_T_82575) || WM_IS_ICHPCH(sc))
+                       evcnt_detach(&sc->sc_ev_tsctfc);
+               else
+                       evcnt_detach(&sc->sc_ev_cbrmpc);
        }
 
        if (sc->sc_type >= WM_T_82542_2_1) {
@@ -3466,8 +3547,17 @@ wm_detach(device_t self, int flags __unu
                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_rxdmtc);
                evcnt_detach(&sc->sc_ev_icrxoc);
+       } else if (!WM_IS_ICHPCH(sc)) {
+               evcnt_detach(&sc->sc_ev_rpthc);
+               evcnt_detach(&sc->sc_ev_debug1);
+               evcnt_detach(&sc->sc_ev_debug2);
+               evcnt_detach(&sc->sc_ev_debug3);
+               evcnt_detach(&sc->sc_ev_hgptc);
+               evcnt_detach(&sc->sc_ev_debug4);
+               evcnt_detach(&sc->sc_ev_rxdmtc);
+               evcnt_detach(&sc->sc_ev_htcbdpc);
        }
        if ((sc->sc_type >= WM_T_I350) && (sc->sc_type < WM_T_80003)) {
                evcnt_detach(&sc->sc_ev_b2ogprc);
@@ -3774,14 +3864,27 @@ wm_tick(void *arg)
        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);
+               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));
-               WM_EVCNT_ADD(&sc->sc_ev_tsctfc, CSR_READ(sc, WMREG_TSCTFC));
+               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;
 
@@ -3860,9 +3963,18 @@ wm_tick(void *arg)
                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,
+               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));
        }
 
        if (((sc->sc_type >= WM_T_I350) && (sc->sc_type < WM_T_80003))
@@ -4989,7 +5101,7 @@ wm_initialize_hardware_bits(struct wm_so
 
        /* For 82571 variant, 80003 and ICHs */
        if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583))
-           || (sc->sc_type >= WM_T_80003)) {
+           || WM_IS_ICHPCH(sc)) {
 
                /* Transmit Descriptor Control 0 */
                reg = CSR_READ(sc, WMREG_TXDCTL(0));
diff -r f2a3361d3915 -r 71bdc27a765e sys/dev/pci/if_wmreg.h
--- a/sys/dev/pci/if_wmreg.h    Thu May 11 07:08:47 2023 +0000
+++ b/sys/dev/pci/if_wmreg.h    Thu May 11 07:14:46 2023 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_wmreg.h,v 1.128 2022/10/19 06:37:25 msaitoh Exp $   */
+/*     $NetBSD: if_wmreg.h,v 1.129 2023/05/11 07:14:46 msaitoh Exp $   */
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -1155,7 +1155,12 @@ struct livengood_tcpip_ctxdesc {
 #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 */
+
+/* Old */
 #define        WMREG_CEXTERR   0x403c  /* Carrier Extension Error Count */
+/* New */
+#define        WMREG_HTDPMC    0x403c  /* Host Tx Discarded Packets by MAC Count */
+
 #define        WMREG_RLEC      0x4040  /* Receive Length Error Count */
 #define        WMREG_XONRXC    0x4048  /* XON Rx Count - R/clr */
 #define        WMREG_XONTXC    0x404c  /* XON Tx Count - R/clr */
@@ -1199,8 +1204,15 @@ struct livengood_tcpip_ctxdesc {
 #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 */
+
+/* Old */
 #define        WMREG_TSCTFC    0x40fc  /* TCP Segmentation Context Tx Fail */
+/* New */
+#define        WMREG_CBRMPC    0x40fc  /* Circuit Breaker Rx Manageability Packet */
+
 #define        WMREG_IAC       0x4100  /* Interrupt Assertion Count */
+
+/* Old */
 #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 */
@@ -1209,6 +1221,16 @@ struct livengood_tcpip_ctxdesc {
 #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 */
+/* New */
+#define        WMREG_RPTHC     0x4104  /* Rx Pkt To Host Count */
+#define        WMREG_DEBUG1    0x4108  /* Debug Counter 1 */
+#define        WMREG_DEBUG2    0x410c  /* Debug Counter 2 */
+#define        WMREG_DEBUG3    0x4110  /* Debug Counter 3 */
+#define        WMREG_HGPTC     0x4118  /* Host Good Packets Tx Count (>=82576?) */
+#define        WMREG_DEBUG4    0x411c  /* Debug Counter 4 */
+#define        WMREG_RXDMTC    0x4120  /* Rx Desc Min Thresh Count */



Home | Main Index | Thread Index | Old Index