Module Name: src Committed By: martin Date: Thu Feb 29 10:46:28 UTC 2024
Modified Files: src/sys/dev/pci [netbsd-8]: if_wm.c if_wmreg.h Log Message: Pull up the following, requested by msaitoh in ticket #1938: sys/dev/pci/if_wm.c 1.792,1.794-1.798 via patch sys/dev/pci/if_wmreg.h 1.131 - Add RQDPC(Receive Queue Drop Packet Count) to iqdrops. - Drop frames if the RX descriptor ring has no room on multiqueue system. - Improve dmesg output. - Print RX packet buffer size. - Fix the upper 16bit of Image Unique ID(EtrackID). - Fix comment. To generate a diff of this commit: cvs rdiff -u -r1.508.4.54 -r1.508.4.55 src/sys/dev/pci/if_wm.c cvs rdiff -u -r1.98.6.18 -r1.98.6.19 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.508.4.54 src/sys/dev/pci/if_wm.c:1.508.4.55 --- src/sys/dev/pci/if_wm.c:1.508.4.54 Sat Feb 3 12:04:06 2024 +++ src/sys/dev/pci/if_wm.c Thu Feb 29 10:46:27 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.508.4.54 2024/02/03 12:04:06 martin Exp $ */ +/* $NetBSD: if_wm.c,v 1.508.4.55 2024/02/29 10:46:27 martin 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.508.4.54 2024/02/03 12:04:06 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.55 2024/02/29 10:46:27 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -469,9 +469,9 @@ struct wm_rxqueue { /* RX event counters */ WM_Q_EVCNT_DEFINE(rxq, intr); /* Interrupts */ WM_Q_EVCNT_DEFINE(rxq, defer); /* Rx deferred processing */ - WM_Q_EVCNT_DEFINE(rxq, ipsum); /* IP checksums checked */ WM_Q_EVCNT_DEFINE(rxq, tusum); /* TCP/UDP cksums checked */ + WM_Q_EVCNT_DEFINE(rxq, qdrop); /* Rx queue drop packet */ #endif }; @@ -2693,6 +2693,10 @@ alloc_retry: /* Reset the chip to a known state. */ wm_reset(sc); + /* sc->sc_pba is set in wm_reset(). */ + aprint_verbose_dev(sc->sc_dev, "RX packet buffer size: %uKB\n", + sc->sc_pba); + /* * Check for I21[01] PLL workaround. * @@ -6526,6 +6530,7 @@ 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; + uint64_t total_qdrop = 0; crcerrs = CSR_READ(sc, WMREG_CRCERRS); symerrc = CSR_READ(sc, WMREG_SYMERRC); @@ -6674,6 +6679,22 @@ wm_update_stats(struct wm_softc *sc) WM_EVCNT_ADD(&sc->sc_ev_lenerrs, CSR_READ(sc, WMREG_LENERRS)); WM_EVCNT_ADD(&sc->sc_ev_scvpc, CSR_READ(sc, WMREG_SCVPC)); WM_EVCNT_ADD(&sc->sc_ev_hrmpc, CSR_READ(sc, WMREG_HRMPC)); +#ifdef WM_EVENT_COUNTERS + for (int i = 0; i < sc->sc_nqueues; i++) { + struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq; + uint32_t rqdpc; + + rqdpc = CSR_READ(sc, WMREG_RQDPC(i)); + /* + * On I210 and newer device, the RQDPC register is not + * cleard on read. + */ + if ((rqdpc != 0) && (sc->sc_type >= WM_T_I210)) + CSR_WRITE(sc, WMREG_RQDPC(i), 0); + WM_Q_EVCNT_ADD(rxq, qdrop, rqdpc); + total_qdrop += rqdpc; + } +#endif } if ((sc->sc_type >= WM_T_I350) && !WM_IS_ICHPCH(sc)) { WM_EVCNT_ADD(&sc->sc_ev_tlpic, CSR_READ(sc, WMREG_TLPIC)); @@ -6702,7 +6723,7 @@ wm_update_stats(struct wm_softc *sc) * If you want to know the nubmer of WMREG_RMBC, you should use such as * own EVCNT instead of if_iqdrops. */ - ifp->if_iqdrops += mpc; + ifp->if_iqdrops += mpc + total_qdrop; } void @@ -6719,6 +6740,8 @@ wm_clear_evcnt(struct wm_softc *sc) WM_Q_EVCNT_STORE(rxq, defer, 0); WM_Q_EVCNT_STORE(rxq, ipsum, 0); WM_Q_EVCNT_STORE(rxq, tusum, 0); + if ((sc->sc_type >= WM_T_82575) && !WM_IS_ICHPCH(sc)) + WM_Q_EVCNT_STORE(rxq, qdrop, 0); } /* TX queues */ @@ -8052,9 +8075,10 @@ wm_alloc_txrx_queues(struct wm_softc *sc WM_Q_INTR_EVCNT_ATTACH(rxq, intr, rxq, i, xname); WM_Q_INTR_EVCNT_ATTACH(rxq, defer, rxq, i, xname); - WM_Q_MISC_EVCNT_ATTACH(rxq, ipsum, rxq, i, xname); WM_Q_MISC_EVCNT_ATTACH(rxq, tusum, rxq, i, xname); + if ((sc->sc_type >= WM_T_82575) && !WM_IS_ICHPCH(sc)) + WM_Q_MISC_EVCNT_ATTACH(rxq, qdrop, rxq, i, xname); #endif /* WM_EVENT_COUNTERS */ rx_done++; @@ -8117,6 +8141,8 @@ wm_free_txrx_queues(struct wm_softc *sc) WM_Q_EVCNT_DETACH(rxq, defer, rxq, i); WM_Q_EVCNT_DETACH(rxq, ipsum, rxq, i); WM_Q_EVCNT_DETACH(rxq, tusum, rxq, i); + if ((sc->sc_type >= WM_T_82575) && !WM_IS_ICHPCH(sc)) + WM_Q_EVCNT_DETACH(rxq, qdrop, rxq, i); #endif /* WM_EVENT_COUNTERS */ wm_free_rx_buffer(sc, rxq); @@ -8306,6 +8332,8 @@ wm_init_rx_regs(struct wm_softc *sc, str rxq->rxq_descsize * rxq->rxq_ndesc); if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) { + uint32_t srrctl; + if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1)) panic("%s: MCLBYTES %d unsupported for 82575 " "or higher\n", __func__, MCLBYTES); @@ -8314,9 +8342,17 @@ wm_init_rx_regs(struct wm_softc *sc, str * Currently, support SRRCTL_DESCTYPE_ADV_ONEBUF * only. */ - CSR_WRITE(sc, WMREG_SRRCTL(qid), - SRRCTL_DESCTYPE_ADV_ONEBUF - | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT)); + srrctl = SRRCTL_DESCTYPE_ADV_ONEBUF + | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT); + /* + * Drop frames if the RX descriptor ring has no room. + * This is enabled only on multiqueue system to avoid + * bad influence to other queues. + */ + if (sc->sc_nqueues > 1) + srrctl |= SRRCTL_DROP_EN; + CSR_WRITE(sc, WMREG_SRRCTL(qid), srrctl); + CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8) | RXDCTL_WTHRESH(1)); @@ -10943,9 +10979,9 @@ wm_linkintr_msix(void *arg) /* * XXX 82574 MSI-X mode workaround * - * 82574 MSI-X mode causes receive overrun(RXO) interrupt as ICR_OTHER - * MSI-X vector, furthermore it does not cause neigher ICR_RXQ(0) nor - * ICR_RXQ(1) vector. So, we generate ICR_RXQ(0) and ICR_RXQ(1) + * 82574 MSI-X mode causes a receive overrun(RXO) interrupt as an + * ICR_OTHER MSI-X vector; furthermore it causes neither ICR_RXQ(0) + * nor ICR_RXQ(1) vectors. So, we generate ICR_RXQ(0) and ICR_RXQ(1) * interrupts by writing WMREG_ICS to process receive packets. */ if (sc->sc_type == WM_T_82574 && ((reg & ICR_RXO) != 0)) { @@ -14973,16 +15009,17 @@ printver: /* Option ROM Version */ if ((off != 0x0000) && (off != 0xffff)) { int rv; + uint16_t oid0, oid1; off += NVM_COMBO_VER_OFF; - rv = wm_nvm_read(sc, off + 1, 1, &uid1); - rv |= wm_nvm_read(sc, off, 1, &uid0); - if ((rv == 0) && (uid0 != 0) && (uid0 != 0xffff) - && (uid1 != 0) && (uid1 != 0xffff)) { + rv = wm_nvm_read(sc, off + 1, 1, &oid1); + rv |= wm_nvm_read(sc, off, 1, &oid0); + if ((rv == 0) && (oid0 != 0) && (oid0 != 0xffff) + && (oid1 != 0) && (oid1 != 0xffff)) { /* 16bits */ - major = uid0 >> 8; - build = (uid0 << 8) | (uid1 >> 8); - patch = uid1 & 0x00ff; + major = oid0 >> 8; + build = (oid0 << 8) | (oid1 >> 8); + patch = oid1 & 0x00ff; aprint_verbose(", option ROM Version %d.%d.%d", major, build, patch); } Index: src/sys/dev/pci/if_wmreg.h diff -u src/sys/dev/pci/if_wmreg.h:1.98.6.18 src/sys/dev/pci/if_wmreg.h:1.98.6.19 --- src/sys/dev/pci/if_wmreg.h:1.98.6.18 Wed Oct 18 14:41:54 2023 +++ src/sys/dev/pci/if_wmreg.h Thu Feb 29 10:46:28 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wmreg.h,v 1.98.6.18 2023/10/18 14:41:54 martin Exp $ */ +/* $NetBSD: if_wmreg.h,v 1.98.6.19 2024/02/29 10:46:28 martin Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -857,6 +857,9 @@ struct livengood_tcpip_ctxdesc { #define RXDCTL_QUEUE_ENABLE 0x02000000 /* Enable specific Tx Queue */ #define RXDCTL_SWFLSH 0x04000000 /* Rx Desc. write-back flushing */ +#define WMREG_RQDPC(x) (((x) < 4) ? (0x2830 + (0x100 * (x))) : \ + (0xc030 + (0x40 * (x)))) /* Receive Queue Drop Packet Count */ + #define WMREG_OLD_RDTR1 0x0130 /* Receive Delay Timer (ring 1) */ #define WMREG_OLD_RDBA1_LO 0x0138 /* Receive Descriptor Base Low (ring 1) */ #define WMREG_OLD_RDBA1_HI 0x013c /* Receive Descriptor Base High (ring 1) */