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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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;