Module Name: src Committed By: skrll Date: Sun Dec 24 16:12:55 UTC 2023
Modified Files: src/sys/arch/arm/rockchip: rk_eqos.c src/sys/dev/acpi: eqos_acpi.c src/sys/dev/ic: dwc_eqos.c Log Message: eqos(4): MP improvements Remove the non-MP-safe scaffolding and pass MP safe flags for callout and interrupt handlers. Where we had #ifndef EQOS_MPSAFE splnet(), we also had EQOS_LOCK, which implies splnet, so just remove the conditional splnet. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/rockchip/rk_eqos.c cvs rdiff -u -r1.1 -r1.2 src/sys/dev/acpi/eqos_acpi.c cvs rdiff -u -r1.34 -r1.35 src/sys/dev/ic/dwc_eqos.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/rockchip/rk_eqos.c diff -u src/sys/arch/arm/rockchip/rk_eqos.c:1.1 src/sys/arch/arm/rockchip/rk_eqos.c:1.2 --- src/sys/arch/arm/rockchip/rk_eqos.c:1.1 Tue Aug 23 05:40:46 2022 +++ src/sys/arch/arm/rockchip/rk_eqos.c Sun Dec 24 16:12:54 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: rk_eqos.c,v 1.1 2022/08/23 05:40:46 ryo Exp $ */ +/* $NetBSD: rk_eqos.c,v 1.2 2023/12/24 16:12:54 skrll Exp $ */ /*- * Copyright (c) 2022 Ryo Shimizu <r...@nerv.org> @@ -25,10 +25,9 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ -#include "opt_net_mpsafe.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rk_eqos.c,v 1.1 2022/08/23 05:40:46 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rk_eqos.c,v 1.2 2023/12/24 16:12:54 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -392,12 +391,7 @@ rk_eqos_attach(device_t parent, device_t if (eqos_attach(sc) != 0) return; -#ifdef NET_MPSAFE -#define FDT_INTR_FLAGS FDT_INTR_MPSAFE -#else -#define FDT_INTR_FLAGS 0 -#endif - if (fdtbus_intr_establish_xname(phandle, 0, IPL_NET, FDT_INTR_FLAGS, + if (fdtbus_intr_establish_xname(phandle, 0, IPL_NET, FDT_INTR_MPSAFE, eqos_intr, sc, device_xname(self)) == NULL) { aprint_error_dev(self, "failed to establish interrupt on %s\n", intrstr); Index: src/sys/dev/acpi/eqos_acpi.c diff -u src/sys/dev/acpi/eqos_acpi.c:1.1 src/sys/dev/acpi/eqos_acpi.c:1.2 --- src/sys/dev/acpi/eqos_acpi.c:1.1 Mon Jan 3 17:19:41 2022 +++ src/sys/dev/acpi/eqos_acpi.c Sun Dec 24 16:12:54 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: eqos_acpi.c,v 1.1 2022/01/03 17:19:41 jmcneill Exp $ */ +/* $NetBSD: eqos_acpi.c,v 1.2 2023/12/24 16:12:54 skrll Exp $ */ /*- * Copyright (c) 2022 Jared McNeill <jmcne...@invisible.ca> @@ -26,10 +26,8 @@ * SUCH DAMAGE. */ -#include "opt_net_mpsafe.h" - #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: eqos_acpi.c,v 1.1 2022/01/03 17:19:41 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: eqos_acpi.c,v 1.2 2023/12/24 16:12:54 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -52,12 +50,6 @@ __KERNEL_RCSID(0, "$NetBSD: eqos_acpi.c, #include <dev/acpi/acpivar.h> #include <dev/acpi/acpi_intr.h> -#ifdef NET_MPSAFE -#define EQOS_INTR_MPSAFE true -#else -#define EQOS_INTR_MPSAFE false -#endif - #define CSR_RATE_RGMII 125000000 static const struct device_compatible_entry compat_data[] = { @@ -132,7 +124,7 @@ eqos_acpi_attach(device_t parent, device goto done; ih = acpi_intr_establish(self, (uint64_t)(uintptr_t)handle, IPL_NET, - EQOS_INTR_MPSAFE, eqos_intr, sc, device_xname(self)); + true, eqos_intr, sc, device_xname(self)); if (ih == NULL) { aprint_error_dev(self, "couldn't establish interrupt\n"); goto done; Index: src/sys/dev/ic/dwc_eqos.c diff -u src/sys/dev/ic/dwc_eqos.c:1.34 src/sys/dev/ic/dwc_eqos.c:1.35 --- src/sys/dev/ic/dwc_eqos.c:1.34 Mon Nov 13 15:07:19 2023 +++ src/sys/dev/ic/dwc_eqos.c Sun Dec 24 16:12:55 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc_eqos.c,v 1.34 2023/11/13 15:07:19 msaitoh Exp $ */ +/* $NetBSD: dwc_eqos.c,v 1.35 2023/12/24 16:12:55 skrll Exp $ */ /*- * Copyright (c) 2022 Jared McNeill <jmcne...@invisible.ca> @@ -35,10 +35,8 @@ * Add detach function. */ -#include "opt_net_mpsafe.h" - #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.34 2023/11/13 15:07:19 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.35 2023/12/24 16:12:55 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -84,12 +82,7 @@ unsigned int eqos_debug; /* Default valu #define DPRINTF(FLAG, FORMAT, ...) ((void)0) #endif -#ifdef NET_MPSAFE -#define EQOS_MPSAFE 1 #define CALLOUT_FLAGS CALLOUT_MPSAFE -#else -#define CALLOUT_FLAGS 0 -#endif #define DESC_BOUNDARY ((sizeof(bus_size_t) > 4) ? (1ULL << 32) : 0) #define DESC_ALIGN sizeof(struct eqos_dma_desc) @@ -462,19 +455,12 @@ eqos_tick(void *softc) { struct eqos_softc * const sc = softc; struct mii_data * const mii = &sc->sc_mii; -#ifndef EQOS_MPSAFE - int s = splnet(); -#endif EQOS_LOCK(sc); mii_tick(mii); if (sc->sc_running) callout_schedule(&sc->sc_stat_ch, hz); EQOS_UNLOCK(sc); - -#ifndef EQOS_MPSAFE - splx(s); -#endif } static uint32_t @@ -493,7 +479,7 @@ static void eqos_setup_rxfilter(struct eqos_softc *sc) { struct ethercom *ec = &sc->sc_ec; - struct ifnet *ifp = &ec->ec_if; + struct ifnet * const ifp = &ec->ec_if; uint32_t pfil, crc, hashreg, hashbit, hash[2]; struct ether_multi *enm; struct ether_multistep step; @@ -1144,6 +1130,8 @@ eqos_intr(void *arg) struct ifnet * const ifp = &sc->sc_ec.ec_if; uint32_t mac_status, mtl_status, dma_status, rx_tx_status; + EQOS_LOCK(sc); + sc->sc_ev_intr.ev_count++; mac_status = RD4(sc, GMAC_MAC_INTERRUPT_STATUS); @@ -1164,7 +1152,6 @@ eqos_intr(void *arg) WR4(sc, GMAC_DMA_CHAN0_STATUS, dma_status); } - EQOS_LOCK(sc); if ((dma_status & GMAC_DMA_CHAN0_STATUS_RI) != 0) { eqos_rxintr(sc, 0); sc->sc_ev_rxintr.ev_count++; @@ -1177,13 +1164,14 @@ eqos_intr(void *arg) if_schedule_deferred_start(ifp); sc->sc_ev_txintr.ev_count++; } + rx_tx_status = RD4(sc, GMAC_MAC_RX_TX_STATUS); + EQOS_UNLOCK(sc); if ((mac_status | mtl_status | dma_status) == 0) { DPRINTF(EDEB_NOTE, "spurious interrupt?!\n"); } - rx_tx_status = RD4(sc, GMAC_MAC_RX_TX_STATUS); if (rx_tx_status) { sc->sc_ev_status.ev_count++; if ((rx_tx_status & GMAC_MAC_RX_TX_STATUS_RWT) != 0) @@ -1212,15 +1200,19 @@ static int eqos_ioctl(struct ifnet *ifp, u_long cmd, void *data) { struct eqos_softc * const sc = ifp->if_softc; - struct ifreq * const ifr = (struct ifreq *)data; - int error, s; + int error; -#ifndef EQOS_MPSAFE - s = splnet(); -#endif + switch (cmd) { + case SIOCADDMULTI: + case SIOCDELMULTI: + break; + default: + KASSERT(IFNET_LOCKED(ifp)); + } switch (cmd) { - case SIOCSIFMTU: + case SIOCSIFMTU: { + struct ifreq * const ifr = (struct ifreq *)data; if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > EQOS_MAX_MTU) { error = EINVAL; } else { @@ -1228,14 +1220,12 @@ eqos_ioctl(struct ifnet *ifp, u_long cmd error = 0; /* no need ENETRESET */ } break; - default: -#ifdef EQOS_MPSAFE - s = splnet(); -#endif + } + default: { + const int s = splnet(); error = ether_ioctl(ifp, cmd, data); -#ifdef EQOS_MPSAFE splx(s); -#endif + if (error != ENETRESET) break; @@ -1243,21 +1233,16 @@ eqos_ioctl(struct ifnet *ifp, u_long cmd if (cmd == SIOCSIFCAP) error = (*ifp->if_init)(ifp); - else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) - ; - else { + else if (cmd == SIOCADDMULTI || cmd == SIOCDELMULTI) { EQOS_LOCK(sc); if (sc->sc_running) eqos_setup_rxfilter(sc); EQOS_UNLOCK(sc); } break; + } } -#ifndef EQOS_MPSAFE - splx(s); -#endif - return error; } @@ -1538,7 +1523,7 @@ eqos_attach(struct eqos_softc *sc) mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NET); mutex_init(&sc->sc_txlock, MUTEX_DEFAULT, IPL_NET); - callout_init(&sc->sc_stat_ch, CALLOUT_FLAGS); + callout_init(&sc->sc_stat_ch, CALLOUT_MPSAFE); callout_setfunc(&sc->sc_stat_ch, eqos_tick, sc); eqos_get_eaddr(sc, eaddr); @@ -1568,9 +1553,7 @@ eqos_attach(struct eqos_softc *sc) ifp->if_softc = sc; snprintf(ifp->if_xname, IFNAMSIZ, "%s", device_xname(sc->sc_dev)); ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; -#ifdef EQOS_MPSAFE ifp->if_extflags = IFEF_MPSAFE; -#endif ifp->if_start = eqos_start; ifp->if_ioctl = eqos_ioctl; ifp->if_init = eqos_init;