From owner-svn-src-all@freebsd.org Fri Oct 9 22:23:40 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 3F6B342F282; Fri, 9 Oct 2020 22:23:40 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7Mzc1Jbrz3VLv; Fri, 9 Oct 2020 22:23:40 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id EB3DC20577; Fri, 9 Oct 2020 22:23:39 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099MNdIt012570; Fri, 9 Oct 2020 22:23:39 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099MNdOD012568; Fri, 9 Oct 2020 22:23:39 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010092223.099MNdOD012568@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Fri, 9 Oct 2020 22:23:39 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366589 - in head/sys/dev/cxgbe: . common X-SVN-Group: head X-SVN-Commit-Author: np X-SVN-Commit-Paths: in head/sys/dev/cxgbe: . common X-SVN-Commit-Revision: 366589 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Oct 2020 22:23:40 -0000 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..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);