Author: np
Date: Fri Oct  9 22:23:39 2020
New Revision: 366589
URL: https://svnweb.freebsd.org/changeset/base/366589

Log:
  cxgbe(4): More fixes for the T6 FCS error counter.
  
  r365732 was the first attempt to get an accurate count but it was
  writing to some read-only registers to clear them and that obviously
  didn't work.  Instead, note the counter's value when it is supposed to
  be cleared and subtract it from future readings.
  
  dev.<port>.stats.rx_fcs_error should not be serviced from the MPS
  register for T6.
  
  The stats.* sysctls should all use T5_PORT_REG for T5 and above.  This
  must have been missed in the initial T5 support years ago.  Fix it while
  here.
  
  MFC after:    3 days
  Sponsored by: Chelsio Communications

Modified:
  head/sys/dev/cxgbe/adapter.h
  head/sys/dev/cxgbe/common/t4_hw.c
  head/sys/dev/cxgbe/t4_main.c

Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h        Fri Oct  9 21:01:53 2020        
(r366588)
+++ head/sys/dev/cxgbe/adapter.h        Fri Oct  9 22:23:39 2020        
(r366589)
@@ -314,6 +314,8 @@ struct port_info {
        struct port_stats stats;
        u_int tnl_cong_drops;
        u_int tx_parse_error;
+       int fcs_reg;
+       uint64_t fcs_base;
        u_long  tx_toe_tls_records;
        u_long  tx_toe_tls_octets;
        u_long  rx_toe_tls_records;

Modified: head/sys/dev/cxgbe/common/t4_hw.c
==============================================================================
--- head/sys/dev/cxgbe/common/t4_hw.c   Fri Oct  9 21:01:53 2020        
(r366588)
+++ head/sys/dev/cxgbe/common/t4_hw.c   Fri Oct  9 22:23:39 2020        
(r366589)
@@ -6852,8 +6852,8 @@ void t4_get_port_stats_offset(struct adapter *adap, in
  */
 void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
 {
-       u32 bgmap = adap2pinfo(adap, idx)->mps_bg_map;
-       struct link_config *lc = &adap->port[idx]->link_cfg;
+       struct port_info *pi = adap->port[idx];
+       u32 bgmap = pi->mps_bg_map;
        u32 stat_ctl = t4_read_reg(adap, A_MPS_STAT_CTL);
 
 #define GET_STAT(name) \
@@ -6922,25 +6922,8 @@ void t4_get_port_stats(struct adapter *adap, int idx, 
        p->rx_ppp6              = GET_STAT(RX_PORT_PPP6);
        p->rx_ppp7              = GET_STAT(RX_PORT_PPP7);
 
-       /*
-        * The T6's MPS's RX_PORT_CRC_ERROR register doesn't actually count CRC
-        * errors so get that information from the MAC instead.  Which MAC is in
-        * use depends on speed and FEC.  The MAC counters clear on reset or
-        * link state change so we are only reporting errors for this
-        * incarnation of the link here.
-        */
-       if (chip_id(adap) != CHELSIO_T6)
-               p->rx_fcs_err = GET_STAT(RX_PORT_CRC_ERROR);
-       else if (lc->link_ok) {
-               if (lc->speed > 25000 ||
-                   (lc->speed == 25000 && lc->fec == FEC_RS)) {
-                       p->rx_fcs_err = t4_read_reg64(adap, T5_PORT_REG(idx,
-                           A_MAC_PORT_AFRAMECHECKSEQUENCEERRORS));
-               } else {
-                       p->rx_fcs_err = t4_read_reg64(adap, T5_PORT_REG(idx,
-                           A_MAC_PORT_MTIP_1G10G_RX_CRCERRORS));
-               }
-       }
+       if (pi->fcs_reg != -1)
+               p->rx_fcs_err = t4_read_reg64(adap, pi->fcs_reg) - pi->fcs_base;
 
        if (chip_id(adap) >= CHELSIO_T5) {
                if (stat_ctl & F_COUNTPAUSESTATRX) {
@@ -10769,12 +10752,6 @@ void t4_clr_port_stats(struct adapter *adap, int idx)
                        t4_write_reg(adap,
                        A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L + i * 8, 0);
                }
-       if (chip_id(adap) == CHELSIO_T6) {
-               t4_write_reg64(adap, T5_PORT_REG(idx,
-                   A_MAC_PORT_AFRAMECHECKSEQUENCEERRORS), 0);
-               t4_write_reg64(adap, T5_PORT_REG(idx,
-                   A_MAC_PORT_MTIP_1G10G_RX_CRCERRORS), 0);
-       }
 }
 
 /**

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Fri Oct  9 21:01:53 2020        
(r366588)
+++ head/sys/dev/cxgbe/t4_main.c        Fri Oct  9 22:23:39 2020        
(r366589)
@@ -1253,6 +1253,23 @@ t4_attach(device_t dev)
                mtx_init(&pi->pi_lock, pi->lockname, 0, MTX_DEF);
                sc->chan_map[pi->tx_chan] = i;
 
+               /*
+                * The MPS counter for FCS errors doesn't work correctly on the
+                * T6 so we use the MAC counter here.  Which MAC is in use
+                * depends on the link settings which will be known when the
+                * link comes up.
+                */
+               if (is_t6(sc)) {
+                       pi->fcs_reg = -1;
+               } else if (is_t4(sc)) {
+                       pi->fcs_reg = PORT_REG(pi->tx_chan,
+                           A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L);
+               } else {
+                       pi->fcs_reg = T5_PORT_REG(pi->tx_chan,
+                           A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L);
+               }
+               pi->fcs_base = 0;
+
                /* All VIs on this port share this media. */
                ifmedia_init(&pi->media, IFM_IMASK, cxgbe_media_change,
                    cxgbe_media_status);
@@ -7049,155 +7066,88 @@ cxgbe_sysctls(struct port_info *pi)
            &pi->tx_parse_error, 0,
            "# of tx packets with invalid length or # of segments");
 
-#define SYSCTL_ADD_T4_REG64(pi, name, desc, reg) \
-    SYSCTL_ADD_OID(ctx, children, OID_AUTO, name, \
-        CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, reg, \
+#define T4_REGSTAT(name, stat, desc) \
+    SYSCTL_ADD_OID(ctx, children, OID_AUTO, #name, \
+        CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, \
+       (is_t4(sc) ? PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_##stat##_L) : \
+       T5_PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_##stat##_L)), \
         sysctl_handle_t4_reg64, "QU", desc)
 
-       SYSCTL_ADD_T4_REG64(pi, "tx_octets", "# of octets in good frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BYTES_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_frames", "total # of good frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_FRAMES_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_bcast_frames", "# of broadcast frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BCAST_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_mcast_frames", "# of multicast frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_MCAST_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ucast_frames", "# of unicast frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_UCAST_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_error_frames", "# of error frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_ERROR_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_frames_64",
-           "# of tx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_64B_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_frames_65_127",
-           "# of tx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_65B_127B_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_frames_128_255",
-           "# of tx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_128B_255B_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_frames_256_511",
-           "# of tx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_256B_511B_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_frames_512_1023",
-           "# of tx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_512B_1023B_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_frames_1024_1518",
-           "# of tx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1024B_1518B_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_frames_1519_max",
-           "# of tx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1519B_MAX_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_drop", "# of dropped tx frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_DROP_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_pause", "# of pause frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PAUSE_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ppp0", "# of PPP prio 0 frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP0_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ppp1", "# of PPP prio 1 frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP1_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ppp2", "# of PPP prio 2 frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP2_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ppp3", "# of PPP prio 3 frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP3_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ppp4", "# of PPP prio 4 frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP4_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ppp5", "# of PPP prio 5 frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP5_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ppp6", "# of PPP prio 6 frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP6_L));
-       SYSCTL_ADD_T4_REG64(pi, "tx_ppp7", "# of PPP prio 7 frames transmitted",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP7_L));
-
-       SYSCTL_ADD_T4_REG64(pi, "rx_octets", "# of octets in good frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BYTES_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_frames", "total # of good frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_FRAMES_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_bcast_frames", "# of broadcast frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BCAST_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_mcast_frames", "# of multicast frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MCAST_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ucast_frames", "# of unicast frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_UCAST_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_too_long", "# of frames exceeding MTU",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_jabber", "# of jabber frames",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_fcs_err",
-           "# of frames received with bad FCS",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_len_err",
-           "# of frames received with length error",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_symbol_err", "symbol errors",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_runt", "# of short frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LESS_64B_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_frames_64",
-           "# of rx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_64B_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_frames_65_127",
-           "# of rx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_65B_127B_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_frames_128_255",
-           "# of rx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_128B_255B_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_frames_256_511",
-           "# of rx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_256B_511B_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_frames_512_1023",
-           "# of rx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_512B_1023B_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_frames_1024_1518",
-           "# of rx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1024B_1518B_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_frames_1519_max",
-           "# of rx frames in this range",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1519B_MAX_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_pause", "# of pause frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PAUSE_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ppp0", "# of PPP prio 0 frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP0_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ppp1", "# of PPP prio 1 frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP1_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ppp2", "# of PPP prio 2 frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP2_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ppp3", "# of PPP prio 3 frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP3_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ppp4", "# of PPP prio 4 frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP4_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ppp5", "# of PPP prio 5 frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP5_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ppp6", "# of PPP prio 6 frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP6_L));
-       SYSCTL_ADD_T4_REG64(pi, "rx_ppp7", "# of PPP prio 7 frames received",
-           PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP7_L));
-
-#undef SYSCTL_ADD_T4_REG64
-
-#define SYSCTL_ADD_T4_PORTSTAT(name, desc) \
+/* We get these from port_stats and they may be stale by up to 1s */
+#define T4_PORTSTAT(name, desc) \
        SYSCTL_ADD_UQUAD(ctx, children, OID_AUTO, #name, CTLFLAG_RD, \
            &pi->stats.name, desc)
 
-       /* We get these from port_stats and they may be stale by up to 1s */
-       SYSCTL_ADD_T4_PORTSTAT(rx_ovflow0,
-           "# drops due to buffer-group 0 overflows");
-       SYSCTL_ADD_T4_PORTSTAT(rx_ovflow1,
-           "# drops due to buffer-group 1 overflows");
-       SYSCTL_ADD_T4_PORTSTAT(rx_ovflow2,
-           "# drops due to buffer-group 2 overflows");
-       SYSCTL_ADD_T4_PORTSTAT(rx_ovflow3,
-           "# drops due to buffer-group 3 overflows");
-       SYSCTL_ADD_T4_PORTSTAT(rx_trunc0,
-           "# of buffer-group 0 truncated packets");
-       SYSCTL_ADD_T4_PORTSTAT(rx_trunc1,
-           "# of buffer-group 1 truncated packets");
-       SYSCTL_ADD_T4_PORTSTAT(rx_trunc2,
-           "# of buffer-group 2 truncated packets");
-       SYSCTL_ADD_T4_PORTSTAT(rx_trunc3,
-           "# of buffer-group 3 truncated packets");
+       T4_REGSTAT(tx_octets, TX_PORT_BYTES, "# of octets in good frames");
+       T4_REGSTAT(tx_frames, TX_PORT_FRAMES, "total # of good frames");
+       T4_REGSTAT(tx_bcast_frames, TX_PORT_BCAST, "# of broadcast frames");
+       T4_REGSTAT(tx_mcast_frames, TX_PORT_MCAST, "# of multicast frames");
+       T4_REGSTAT(tx_ucast_frames, TX_PORT_UCAST, "# of unicast frames");
+       T4_REGSTAT(tx_error_frames, TX_PORT_ERROR, "# of error frames");
+       T4_REGSTAT(tx_frames_64, TX_PORT_64B, "# of tx frames in this range");
+       T4_REGSTAT(tx_frames_65_127, TX_PORT_65B_127B, "# of tx frames in this 
range");
+       T4_REGSTAT(tx_frames_128_255, TX_PORT_128B_255B, "# of tx frames in 
this range");
+       T4_REGSTAT(tx_frames_256_511, TX_PORT_256B_511B, "# of tx frames in 
this range");
+       T4_REGSTAT(tx_frames_512_1023, TX_PORT_512B_1023B, "# of tx frames in 
this range");
+       T4_REGSTAT(tx_frames_1024_1518, TX_PORT_1024B_1518B, "# of tx frames in 
this range");
+       T4_REGSTAT(tx_frames_1519_max, TX_PORT_1519B_MAX, "# of tx frames in 
this range");
+       T4_REGSTAT(tx_drop, TX_PORT_DROP, "# of dropped tx frames");
+       T4_REGSTAT(tx_pause, TX_PORT_PAUSE, "# of pause frames transmitted");
+       T4_REGSTAT(tx_ppp0, TX_PORT_PPP0, "# of PPP prio 0 frames transmitted");
+       T4_REGSTAT(tx_ppp1, TX_PORT_PPP1, "# of PPP prio 1 frames transmitted");
+       T4_REGSTAT(tx_ppp2, TX_PORT_PPP2, "# of PPP prio 2 frames transmitted");
+       T4_REGSTAT(tx_ppp3, TX_PORT_PPP3, "# of PPP prio 3 frames transmitted");
+       T4_REGSTAT(tx_ppp4, TX_PORT_PPP4, "# of PPP prio 4 frames transmitted");
+       T4_REGSTAT(tx_ppp5, TX_PORT_PPP5, "# of PPP prio 5 frames transmitted");
+       T4_REGSTAT(tx_ppp6, TX_PORT_PPP6, "# of PPP prio 6 frames transmitted");
+       T4_REGSTAT(tx_ppp7, TX_PORT_PPP7, "# of PPP prio 7 frames transmitted");
 
-#undef SYSCTL_ADD_T4_PORTSTAT
+       T4_REGSTAT(rx_octets, RX_PORT_BYTES, "# of octets in good frames");
+       T4_REGSTAT(rx_frames, RX_PORT_FRAMES, "total # of good frames");
+       T4_REGSTAT(rx_bcast_frames, RX_PORT_BCAST, "# of broadcast frames");
+       T4_REGSTAT(rx_mcast_frames, RX_PORT_MCAST, "# of multicast frames");
+       T4_REGSTAT(rx_ucast_frames, RX_PORT_UCAST, "# of unicast frames");
+       T4_REGSTAT(rx_too_long, RX_PORT_MTU_ERROR, "# of frames exceeding MTU");
+       T4_REGSTAT(rx_jabber, RX_PORT_MTU_CRC_ERROR, "# of jabber frames");
+       if (is_t6(sc)) {
+               T4_PORTSTAT(rx_fcs_err,
+                   "# of frames received with bad FCS since last link up");
+       } else {
+               T4_REGSTAT(rx_fcs_err, RX_PORT_CRC_ERROR,
+                   "# of frames received with bad FCS");
+       }
+       T4_REGSTAT(rx_len_err, RX_PORT_LEN_ERROR, "# of frames received with 
length error");
+       T4_REGSTAT(rx_symbol_err, RX_PORT_SYM_ERROR, "symbol errors");
+       T4_REGSTAT(rx_runt, RX_PORT_LESS_64B, "# of short frames received");
+       T4_REGSTAT(rx_frames_64, RX_PORT_64B, "# of rx frames in this range");
+       T4_REGSTAT(rx_frames_65_127, RX_PORT_65B_127B, "# of rx frames in this 
range");
+       T4_REGSTAT(rx_frames_128_255, RX_PORT_128B_255B, "# of rx frames in 
this range");
+       T4_REGSTAT(rx_frames_256_511, RX_PORT_256B_511B, "# of rx frames in 
this range");
+       T4_REGSTAT(rx_frames_512_1023, RX_PORT_512B_1023B, "# of rx frames in 
this range");
+       T4_REGSTAT(rx_frames_1024_1518, RX_PORT_1024B_1518B, "# of rx frames in 
this range");
+       T4_REGSTAT(rx_frames_1519_max, RX_PORT_1519B_MAX, "# of rx frames in 
this range");
+       T4_REGSTAT(rx_pause, RX_PORT_PAUSE, "# of pause frames received");
+       T4_REGSTAT(rx_ppp0, RX_PORT_PPP0, "# of PPP prio 0 frames received");
+       T4_REGSTAT(rx_ppp1, RX_PORT_PPP1, "# of PPP prio 1 frames received");
+       T4_REGSTAT(rx_ppp2, RX_PORT_PPP2, "# of PPP prio 2 frames received");
+       T4_REGSTAT(rx_ppp3, RX_PORT_PPP3, "# of PPP prio 3 frames received");
+       T4_REGSTAT(rx_ppp4, RX_PORT_PPP4, "# of PPP prio 4 frames received");
+       T4_REGSTAT(rx_ppp5, RX_PORT_PPP5, "# of PPP prio 5 frames received");
+       T4_REGSTAT(rx_ppp6, RX_PORT_PPP6, "# of PPP prio 6 frames received");
+       T4_REGSTAT(rx_ppp7, RX_PORT_PPP7, "# of PPP prio 7 frames received");
 
+       T4_PORTSTAT(rx_ovflow0, "# drops due to buffer-group 0 overflows");
+       T4_PORTSTAT(rx_ovflow1, "# drops due to buffer-group 1 overflows");
+       T4_PORTSTAT(rx_ovflow2, "# drops due to buffer-group 2 overflows");
+       T4_PORTSTAT(rx_ovflow3, "# drops due to buffer-group 3 overflows");
+       T4_PORTSTAT(rx_trunc0, "# of buffer-group 0 truncated packets");
+       T4_PORTSTAT(rx_trunc1, "# of buffer-group 1 truncated packets");
+       T4_PORTSTAT(rx_trunc2, "# of buffer-group 2 truncated packets");
+       T4_PORTSTAT(rx_trunc3, "# of buffer-group 3 truncated packets");
+
+#undef T4_REGSTAT
+#undef T4_PORTSTAT
+
        SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, "tx_toe_tls_records",
            CTLFLAG_RD, &pi->tx_toe_tls_records,
            "# of TOE TLS records transmitted");
@@ -10560,6 +10510,12 @@ clear_stats(struct adapter *sc, u_int port_id)
 
        /* MAC stats */
        t4_clr_port_stats(sc, pi->tx_chan);
+       if (is_t6(sc)) {
+               if (pi->fcs_reg != -1)
+                       pi->fcs_base = t4_read_reg64(sc, pi->fcs_reg);
+               else
+                       pi->stats.rx_fcs_err = 0;
+       }
        pi->tx_parse_error = 0;
        pi->tnl_cong_drops = 0;
        mtx_lock(&sc->reg_lock);
@@ -10732,17 +10688,37 @@ t4_os_link_changed(struct port_info *pi)
 {
        struct vi_info *vi;
        struct ifnet *ifp;
-       struct link_config *lc;
+       struct link_config *lc = &pi->link_cfg;
+       struct adapter *sc = pi->adapter;
        int v;
 
        PORT_LOCK_ASSERT_OWNED(pi);
 
+       if (is_t6(sc)) {
+               if (lc->link_ok) {
+                       if (lc->speed > 25000 ||
+                           (lc->speed == 25000 && lc->fec == FEC_RS)) {
+                               pi->fcs_reg = T5_PORT_REG(pi->tx_chan,
+                                   A_MAC_PORT_AFRAMECHECKSEQUENCEERRORS);
+                       } else {
+                               pi->fcs_reg = T5_PORT_REG(pi->tx_chan,
+                                   A_MAC_PORT_MTIP_1G10G_RX_CRCERRORS);
+                       }
+                       pi->fcs_base = t4_read_reg64(sc, pi->fcs_reg);
+                       pi->stats.rx_fcs_err = 0;
+               } else {
+                       pi->fcs_reg = -1;
+               }
+       } else {
+               MPASS(pi->fcs_reg != -1);
+               MPASS(pi->fcs_base == 0);
+       }
+
        for_each_vi(pi, v, vi) {
                ifp = vi->ifp;
                if (ifp == NULL)
                        continue;
 
-               lc = &pi->link_cfg;
                if (lc->link_ok) {
                        ifp->if_baudrate = IF_Mbps(lc->speed);
                        if_link_state_change(ifp, LINK_STATE_UP);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to