Module Name: src Committed By: msaitoh Date: Tue May 28 07:41:50 UTC 2019
Modified Files: src/sys/arch/arm/at91: at91emac.c src/sys/arch/arm/ep93xx: epe.c src/sys/arch/arm/gemini: if_gmc.c src/sys/arch/arm/imx: if_enet.c src/sys/arch/arm/sunxi: sun4i_emac.c src/sys/arch/arm/xscale: ixp425_if_npe.c src/sys/arch/mac68k/dev: if_mc.c src/sys/arch/macppc/dev: am79c950.c if_bm.c if_gm.c src/sys/arch/mips/adm5120/dev: if_admsw.c src/sys/arch/mips/alchemy/dev: if_aumac.c src/sys/arch/mips/atheros/dev: if_ae.c src/sys/arch/mips/cavium/dev: octeon_gmx.c src/sys/arch/mips/sibyte/dev: sbmac.c src/sys/arch/newsmips/apbus: if_sn.c src/sys/arch/playstation2/dev: emac3.c src/sys/arch/powerpc/booke/dev: pq3etsec.c src/sys/arch/powerpc/ibm4xx/dev: if_emac.c src/sys/arch/sgimips/mace: if_mec.c src/sys/arch/sun3/dev: if_ie.c src/sys/dev/bi: if_ni.c src/sys/dev/cadence: if_cemac.c src/sys/dev/ic: aic6915.c ath.c athn.c atw.c awi.c cs89x0.c dm9000.c dp8390.c dp83932.c elinkxl.c gem.c hme.c i82557.c i82586.c i82596.c lan9118.c lance.c lemac.c mb86960.c mtd803.c pdq_ifsubr.c rtl81x9.c rtw.c seeq8005.c sgec.c smc83c170.c tulip.c wi.c src/sys/dev/isa: if_iy.c src/sys/dev/marvell: if_gfe.c if_mvgbe.c if_mvxpe.c src/sys/dev/pci: if_age.c if_alc.c if_ale.c if_bge.c if_bnx.c if_cas.c if_de.c if_dge.c if_et.c if_jme.c if_kse.c if_lii.c if_msk.c if_nfe.c if_pcn.c if_sip.c if_sk.c if_ste.c if_stge.c if_ti.c if_tl.c if_txp.c if_vge.c if_vr.c if_vte.c if_xge.c src/sys/dev/pcmcia: if_ray.c if_xi.c src/sys/dev/qbus: if_il.c if_qe.c src/sys/dev/sbus: be.c qe.c src/sys/dev/scsipi: if_se.c src/sys/dev/usb: if_aue.c if_axe.c if_axen.c if_cue.c if_kue.c if_mue.c if_otus.c if_udav.c if_ure.c if_url.c src/usr.sbin/cpuctl/arch: i386.c Log Message: Use ETHER_LOCK()/ETHER_UNLOCK() for all ethernet drivers to protect ec_multi*. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/arch/arm/at91/at91emac.c cvs rdiff -u -r1.42 -r1.43 src/sys/arch/arm/ep93xx/epe.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/gemini/if_gmc.c cvs rdiff -u -r1.22 -r1.23 src/sys/arch/arm/imx/if_enet.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/sunxi/sun4i_emac.c cvs rdiff -u -r1.40 -r1.41 src/sys/arch/arm/xscale/ixp425_if_npe.c cvs rdiff -u -r1.50 -r1.51 src/sys/arch/mac68k/dev/if_mc.c cvs rdiff -u -r1.44 -r1.45 src/sys/arch/macppc/dev/am79c950.c cvs rdiff -u -r1.59 -r1.60 src/sys/arch/macppc/dev/if_bm.c cvs rdiff -u -r1.54 -r1.55 src/sys/arch/macppc/dev/if_gm.c cvs rdiff -u -r1.23 -r1.24 src/sys/arch/mips/adm5120/dev/if_admsw.c cvs rdiff -u -r1.46 -r1.47 src/sys/arch/mips/alchemy/dev/if_aumac.c cvs rdiff -u -r1.35 -r1.36 src/sys/arch/mips/atheros/dev/if_ae.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/mips/cavium/dev/octeon_gmx.c cvs rdiff -u -r1.59 -r1.60 src/sys/arch/mips/sibyte/dev/sbmac.c cvs rdiff -u -r1.44 -r1.45 src/sys/arch/newsmips/apbus/if_sn.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/playstation2/dev/emac3.c cvs rdiff -u -r1.44 -r1.45 src/sys/arch/powerpc/booke/dev/pq3etsec.c cvs rdiff -u -r1.50 -r1.51 src/sys/arch/powerpc/ibm4xx/dev/if_emac.c cvs rdiff -u -r1.59 -r1.60 src/sys/arch/sgimips/mace/if_mec.c cvs rdiff -u -r1.69 -r1.70 src/sys/arch/sun3/dev/if_ie.c cvs rdiff -u -r1.48 -r1.49 src/sys/dev/bi/if_ni.c cvs rdiff -u -r1.20 -r1.21 src/sys/dev/cadence/if_cemac.c cvs rdiff -u -r1.38 -r1.39 src/sys/dev/ic/aic6915.c src/sys/dev/ic/mtd803.c cvs rdiff -u -r1.126 -r1.127 src/sys/dev/ic/ath.c cvs rdiff -u -r1.20 -r1.21 src/sys/dev/ic/athn.c cvs rdiff -u -r1.167 -r1.168 src/sys/dev/ic/atw.c cvs rdiff -u -r1.97 -r1.98 src/sys/dev/ic/awi.c cvs rdiff -u -r1.45 -r1.46 src/sys/dev/ic/cs89x0.c cvs rdiff -u -r1.19 -r1.20 src/sys/dev/ic/dm9000.c cvs rdiff -u -r1.93 -r1.94 src/sys/dev/ic/dp8390.c cvs rdiff -u -r1.43 -r1.44 src/sys/dev/ic/dp83932.c cvs rdiff -u -r1.130 -r1.131 src/sys/dev/ic/elinkxl.c cvs rdiff -u -r1.118 -r1.119 src/sys/dev/ic/gem.c cvs rdiff -u -r1.104 -r1.105 src/sys/dev/ic/hme.c cvs rdiff -u -r1.152 -r1.153 src/sys/dev/ic/i82557.c cvs rdiff -u -r1.83 -r1.84 src/sys/dev/ic/i82586.c cvs rdiff -u -r1.40 -r1.41 src/sys/dev/ic/i82596.c cvs rdiff -u -r1.33 -r1.34 src/sys/dev/ic/lan9118.c cvs rdiff -u -r1.56 -r1.57 src/sys/dev/ic/lance.c cvs rdiff -u -r1.52 -r1.53 src/sys/dev/ic/lemac.c cvs rdiff -u -r1.91 -r1.92 src/sys/dev/ic/mb86960.c cvs rdiff -u -r1.65 -r1.66 src/sys/dev/ic/pdq_ifsubr.c cvs rdiff -u -r1.105 -r1.106 src/sys/dev/ic/rtl81x9.c cvs rdiff -u -r1.132 -r1.133 src/sys/dev/ic/rtw.c cvs rdiff -u -r1.63 -r1.64 src/sys/dev/ic/seeq8005.c cvs rdiff -u -r1.50 -r1.51 src/sys/dev/ic/sgec.c cvs rdiff -u -r1.89 -r1.90 src/sys/dev/ic/smc83c170.c cvs rdiff -u -r1.195 -r1.196 src/sys/dev/ic/tulip.c cvs rdiff -u -r1.252 -r1.253 src/sys/dev/ic/wi.c cvs rdiff -u -r1.107 -r1.108 src/sys/dev/isa/if_iy.c cvs rdiff -u -r1.53 -r1.54 src/sys/dev/marvell/if_gfe.c cvs rdiff -u -r1.56 -r1.57 src/sys/dev/marvell/if_mvgbe.c cvs rdiff -u -r1.26 -r1.27 src/sys/dev/marvell/if_mvxpe.c cvs rdiff -u -r1.58 -r1.59 src/sys/dev/pci/if_age.c cvs rdiff -u -r1.36 -r1.37 src/sys/dev/pci/if_alc.c src/sys/dev/pci/if_kse.c cvs rdiff -u -r1.30 -r1.31 src/sys/dev/pci/if_ale.c src/sys/dev/pci/if_xge.c cvs rdiff -u -r1.332 -r1.333 src/sys/dev/pci/if_bge.c cvs rdiff -u -r1.84 -r1.85 src/sys/dev/pci/if_bnx.c cvs rdiff -u -r1.34 -r1.35 src/sys/dev/pci/if_cas.c cvs rdiff -u -r1.161 -r1.162 src/sys/dev/pci/if_de.c cvs rdiff -u -r1.53 -r1.54 src/sys/dev/pci/if_dge.c cvs rdiff -u -r1.23 -r1.24 src/sys/dev/pci/if_et.c cvs rdiff -u -r1.42 -r1.43 src/sys/dev/pci/if_jme.c cvs rdiff -u -r1.24 -r1.25 src/sys/dev/pci/if_lii.c cvs rdiff -u -r1.89 -r1.90 src/sys/dev/pci/if_msk.c cvs rdiff -u -r1.69 -r1.70 src/sys/dev/pci/if_nfe.c cvs rdiff -u -r1.70 -r1.71 src/sys/dev/pci/if_pcn.c cvs rdiff -u -r1.172 -r1.173 src/sys/dev/pci/if_sip.c cvs rdiff -u -r1.96 -r1.97 src/sys/dev/pci/if_sk.c cvs rdiff -u -r1.55 -r1.56 src/sys/dev/pci/if_ste.c src/sys/dev/pci/if_txp.c cvs rdiff -u -r1.68 -r1.69 src/sys/dev/pci/if_stge.c cvs rdiff -u -r1.109 -r1.110 src/sys/dev/pci/if_ti.c cvs rdiff -u -r1.115 -r1.116 src/sys/dev/pci/if_tl.c cvs rdiff -u -r1.71 -r1.72 src/sys/dev/pci/if_vge.c cvs rdiff -u -r1.129 -r1.130 src/sys/dev/pci/if_vr.c cvs rdiff -u -r1.25 -r1.26 src/sys/dev/pci/if_vte.c cvs rdiff -u -r1.93 -r1.94 src/sys/dev/pcmcia/if_ray.c cvs rdiff -u -r1.89 -r1.90 src/sys/dev/pcmcia/if_xi.c cvs rdiff -u -r1.34 -r1.35 src/sys/dev/qbus/if_il.c cvs rdiff -u -r1.80 -r1.81 src/sys/dev/qbus/if_qe.c cvs rdiff -u -r1.92 -r1.93 src/sys/dev/sbus/be.c cvs rdiff -u -r1.73 -r1.74 src/sys/dev/sbus/qe.c cvs rdiff -u -r1.101 -r1.102 src/sys/dev/scsipi/if_se.c cvs rdiff -u -r1.153 -r1.154 src/sys/dev/usb/if_aue.c cvs rdiff -u -r1.97 -r1.98 src/sys/dev/usb/if_axe.c cvs rdiff -u -r1.40 -r1.41 src/sys/dev/usb/if_axen.c cvs rdiff -u -r1.83 -r1.84 src/sys/dev/usb/if_cue.c cvs rdiff -u -r1.95 -r1.96 src/sys/dev/usb/if_kue.c cvs rdiff -u -r1.47 -r1.48 src/sys/dev/usb/if_mue.c cvs rdiff -u -r1.37 -r1.38 src/sys/dev/usb/if_otus.c cvs rdiff -u -r1.58 -r1.59 src/sys/dev/usb/if_udav.c cvs rdiff -u -r1.6 -r1.7 src/sys/dev/usb/if_ure.c cvs rdiff -u -r1.64 -r1.65 src/sys/dev/usb/if_url.c cvs rdiff -u -r1.99 -r1.100 src/usr.sbin/cpuctl/arch/i386.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/at91/at91emac.c diff -u src/sys/arch/arm/at91/at91emac.c:1.28 src/sys/arch/arm/at91/at91emac.c:1.29 --- src/sys/arch/arm/at91/at91emac.c:1.28 Thu May 23 16:05:01 2019 +++ src/sys/arch/arm/at91/at91emac.c Tue May 28 07:41:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: at91emac.c,v 1.28 2019/05/23 16:05:01 msaitoh Exp $ */ +/* $NetBSD: at91emac.c,v 1.29 2019/05/28 07:41:46 msaitoh Exp $ */ /* * Copyright (c) 2007 Embedtronics Oy @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: at91emac.c,v 1.28 2019/05/23 16:05:01 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: at91emac.c,v 1.29 2019/05/28 07:41:46 msaitoh Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -807,6 +807,7 @@ emac_setaddr(struct ifnet *ifp) ifp->if_flags &= ~IFF_ALLMULTI; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -845,6 +846,7 @@ emac_setaddr(struct ifnet *ifp) ETHER_NEXT_MULTI(step, enm); nma++; } + ETHER_UNLOCK(ec); // program... DPRINTFN(1,("%s: en0 %02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, Index: src/sys/arch/arm/ep93xx/epe.c diff -u src/sys/arch/arm/ep93xx/epe.c:1.42 src/sys/arch/arm/ep93xx/epe.c:1.43 --- src/sys/arch/arm/ep93xx/epe.c:1.42 Thu May 23 13:10:50 2019 +++ src/sys/arch/arm/ep93xx/epe.c Tue May 28 07:41:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: epe.c,v 1.42 2019/05/23 13:10:50 msaitoh Exp $ */ +/* $NetBSD: epe.c,v 1.43 2019/05/28 07:41:46 msaitoh Exp $ */ /* * Copyright (c) 2004 Jesse Off @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: epe.c,v 1.42 2019/05/23 13:10:50 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: epe.c,v 1.43 2019/05/28 07:41:46 msaitoh Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -722,6 +722,7 @@ epe_setaddr(struct ifnet *ifp) ifp->if_flags &= ~IFF_ALLMULTI; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -761,6 +762,7 @@ epe_setaddr(struct ifnet *ifp) ETHER_NEXT_MULTI(step, enm); nma++; } + ETHER_UNLOCK(ec); EPE_WRITE(AFP, 0); bus_space_write_region_1(sc->sc_iot, sc->sc_ioh, EPE_IndAd, Index: src/sys/arch/arm/gemini/if_gmc.c diff -u src/sys/arch/arm/gemini/if_gmc.c:1.10 src/sys/arch/arm/gemini/if_gmc.c:1.11 --- src/sys/arch/arm/gemini/if_gmc.c:1.10 Thu May 23 13:10:50 2019 +++ src/sys/arch/arm/gemini/if_gmc.c Tue May 28 07:41:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_gmc.c,v 1.10 2019/05/23 13:10:50 msaitoh Exp $ */ +/* $NetBSD: if_gmc.c,v 1.11 2019/05/28 07:41:46 msaitoh Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -47,7 +47,7 @@ #include <net/if_ether.h> #include <net/if_dl.h> -__KERNEL_RCSID(0, "$NetBSD: if_gmc.c,v 1.10 2019/05/23 13:10:50 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gmc.c,v 1.11 2019/05/28 07:41:46 msaitoh Exp $"); #define MAX_TXSEG 32 @@ -195,6 +195,7 @@ gmc_txqueue(struct gmc_softc *sc, gmac_h static void gmc_filter_change(struct gmc_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ether_multi *enm; struct ether_multistep step; uint32_t mhash[2]; @@ -220,7 +221,8 @@ gmc_filter_change(struct gmc_softc *sc) mhash[0] = 0; mhash[1] = 0; - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { size_t i; if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -231,6 +233,7 @@ gmc_filter_change(struct gmc_softc *sc) mhash[(i >> 5) & 1] |= 1 << (i & 31); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); if (sc->sc_gmac_mcast_filter[0] != mhash[0] || sc->sc_gmac_mcast_filter[1] != mhash[1]) { Index: src/sys/arch/arm/imx/if_enet.c diff -u src/sys/arch/arm/imx/if_enet.c:1.22 src/sys/arch/arm/imx/if_enet.c:1.23 --- src/sys/arch/arm/imx/if_enet.c:1.22 Fri May 24 00:13:25 2019 +++ src/sys/arch/arm/imx/if_enet.c Tue May 28 07:41:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_enet.c,v 1.22 2019/05/24 00:13:25 msaitoh Exp $ */ +/* $NetBSD: if_enet.c,v 1.23 2019/05/28 07:41:46 msaitoh Exp $ */ /* * Copyright (c) 2014 Ryo Shimizu <r...@nerv.org> @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_enet.c,v 1.22 2019/05/24 00:13:25 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_enet.c,v 1.23 2019/05/28 07:41:46 msaitoh Exp $"); #include "vlan.h" @@ -775,12 +775,14 @@ enet_setmulti(struct enet_softc *sc) } else { gaddr[0] = gaddr[1] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN); gaddr[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); } ENET_REG_WRITE(sc, ENET_GAUR, gaddr[0]); Index: src/sys/arch/arm/sunxi/sun4i_emac.c diff -u src/sys/arch/arm/sunxi/sun4i_emac.c:1.10 src/sys/arch/arm/sunxi/sun4i_emac.c:1.11 --- src/sys/arch/arm/sunxi/sun4i_emac.c:1.10 Thu May 23 13:10:50 2019 +++ src/sys/arch/arm/sunxi/sun4i_emac.c Tue May 28 07:41:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sun4i_emac.c,v 1.10 2019/05/23 13:10:50 msaitoh Exp $ */ +/* $NetBSD: sun4i_emac.c,v 1.11 2019/05/28 07:41:46 msaitoh Exp $ */ /*- * Copyright (c) 2013-2017 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: sun4i_emac.c,v 1.10 2019/05/23 13:10:50 msaitoh Exp $"); +__KERNEL_RCSID(1, "$NetBSD: sun4i_emac.c,v 1.11 2019/05/28 07:41:46 msaitoh Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -839,7 +839,8 @@ sun4i_emac_ifwatchdog(struct ifnet *ifp) static void sun4i_emac_rx_hash(struct sun4i_emac_softc *sc) { - struct ifnet * const ifp = &sc->sc_ec.ec_if; + struct ethercom *ec = &sc->sc_ec; + struct ifnet * const ifp = &ec->ec_if; struct ether_multistep step; struct ether_multi *enm; uint32_t hash[2]; @@ -864,12 +865,12 @@ sun4i_emac_rx_hash(struct sun4i_emac_sof if ((ifp->if_flags & IFF_PROMISC) == 0) { hash[0] = hash[1] = 0; - ETHER_LOCK(&sc->sc_ec); - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { - ETHER_UNLOCK(&sc->sc_ec); + ETHER_UNLOCK(ec); /* * We must listen to a range of multicast * addresses. For now, just accept all @@ -895,7 +896,7 @@ sun4i_emac_rx_hash(struct sun4i_emac_sof hash[crc >> 5] |= __BIT(crc & 31); ETHER_NEXT_MULTI(step, enm); } - ETHER_UNLOCK(&sc->sc_ec); + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; rxctl |= EMAC_RX_CTL_MHF; } Index: src/sys/arch/arm/xscale/ixp425_if_npe.c diff -u src/sys/arch/arm/xscale/ixp425_if_npe.c:1.40 src/sys/arch/arm/xscale/ixp425_if_npe.c:1.41 --- src/sys/arch/arm/xscale/ixp425_if_npe.c:1.40 Thu May 23 10:40:39 2019 +++ src/sys/arch/arm/xscale/ixp425_if_npe.c Tue May 28 07:41:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ixp425_if_npe.c,v 1.40 2019/05/23 10:40:39 msaitoh Exp $ */ +/* $NetBSD: ixp425_if_npe.c,v 1.41 2019/05/28 07:41:46 msaitoh Exp $ */ /*- * Copyright (c) 2006 Sam Leffler. All rights reserved. @@ -28,7 +28,7 @@ #if 0 __FBSDID("$FreeBSD: src/sys/arm/xscale/ixp425/if_npe.c,v 1.1 2006/11/19 23:55:23 sam Exp $"); #endif -__KERNEL_RCSID(0, "$NetBSD: ixp425_if_npe.c,v 1.40 2019/05/23 10:40:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ixp425_if_npe.c,v 1.41 2019/05/28 07:41:46 msaitoh Exp $"); /* * Intel XScale NPE Ethernet driver. @@ -369,11 +369,13 @@ npe_setmcast(struct npe_softc *sc) memset(clr, 0, ETHER_ADDR_LEN); memset(set, 0xff, ETHER_ADDR_LEN); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto all_multi; } @@ -384,6 +386,7 @@ npe_setmcast(struct npe_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); for (i = 0; i < ETHER_ADDR_LEN; i++) { mask[i] = set[i] | ~clr[i]; @@ -999,6 +1002,7 @@ npe_rxdone(int qid, void *arg) /* Multicast */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { uint64_t lowint, highint, dest; @@ -1017,6 +1021,8 @@ npe_rxdone(int qid, void *arg) } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); + if (match == 0) { /* Discard it */ #if 0 Index: src/sys/arch/mac68k/dev/if_mc.c diff -u src/sys/arch/mac68k/dev/if_mc.c:1.50 src/sys/arch/mac68k/dev/if_mc.c:1.51 --- src/sys/arch/mac68k/dev/if_mc.c:1.50 Thu May 23 10:30:35 2019 +++ src/sys/arch/mac68k/dev/if_mc.c Tue May 28 07:41:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mc.c,v 1.50 2019/05/23 10:30:35 msaitoh Exp $ */ +/* $NetBSD: if_mc.c,v 1.51 2019/05/28 07:41:46 msaitoh Exp $ */ /*- * Copyright (c) 1997 David Huang <k...@azeotrope.org> @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mc.c,v 1.50 2019/05/23 10:30:35 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mc.c,v 1.51 2019/05/28 07:41:46 msaitoh Exp $"); #include "opt_ddb.h" #include "opt_inet.h" @@ -659,6 +659,7 @@ mace_calcladrf(struct ethercom *ec, uint */ *((uint32_t *)af) = *((uint32_t *)af + 1) = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (ETHER_CMP(enm->enm_addrlo, enm->enm_addrhi)) { @@ -670,6 +671,7 @@ mace_calcladrf(struct ethercom *ec, uint * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -688,6 +690,7 @@ mace_calcladrf(struct ethercom *ec, uint ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; return; Index: src/sys/arch/macppc/dev/am79c950.c diff -u src/sys/arch/macppc/dev/am79c950.c:1.44 src/sys/arch/macppc/dev/am79c950.c:1.45 --- src/sys/arch/macppc/dev/am79c950.c:1.44 Thu May 23 10:30:35 2019 +++ src/sys/arch/macppc/dev/am79c950.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: am79c950.c,v 1.44 2019/05/23 10:30:35 msaitoh Exp $ */ +/* $NetBSD: am79c950.c,v 1.45 2019/05/28 07:41:47 msaitoh Exp $ */ /*- * Copyright (c) 1997 David Huang <k...@bga.com> @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: am79c950.c,v 1.44 2019/05/23 10:30:35 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: am79c950.c,v 1.45 2019/05/28 07:41:47 msaitoh Exp $"); #include "opt_inet.h" @@ -665,6 +665,7 @@ mace_calcladrf(struct ethercom *ec, uint *((uint32_t *)af) = *((uint32_t *)af + 1) = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (ETHER_CMP(enm->enm_addrlo, enm->enm_addrhi)) { @@ -676,6 +677,7 @@ mace_calcladrf(struct ethercom *ec, uint * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -700,6 +702,7 @@ mace_calcladrf(struct ethercom *ec, uint ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; return; Index: src/sys/arch/macppc/dev/if_bm.c diff -u src/sys/arch/macppc/dev/if_bm.c:1.59 src/sys/arch/macppc/dev/if_bm.c:1.60 --- src/sys/arch/macppc/dev/if_bm.c:1.59 Thu May 23 10:57:27 2019 +++ src/sys/arch/macppc/dev/if_bm.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bm.c,v 1.59 2019/05/23 10:57:27 msaitoh Exp $ */ +/* $NetBSD: if_bm.c,v 1.60 2019/05/28 07:41:47 msaitoh Exp $ */ /*- * Copyright (C) 1998, 1999, 2000 Tsubai Masanari. All rights reserved. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bm.c,v 1.59 2019/05/23 10:57:27 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bm.c,v 1.60 2019/05/28 07:41:47 msaitoh Exp $"); #include "opt_inet.h" @@ -774,6 +774,7 @@ bmac_ioctl(struct ifnet *ifp, unsigned l void bmac_setladrf(struct bmac_softc *sc) { + struct ethercom *ec = &sc->sc_ethercom; struct ifnet *ifp = &sc->sc_if; struct ether_multi *enm; struct ether_multistep step; @@ -801,7 +802,8 @@ bmac_setladrf(struct bmac_softc *sc) hash[3] = hash[2] = hash[1] = hash[0] = 0; - ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { /* @@ -814,6 +816,7 @@ bmac_setladrf(struct bmac_softc *sc) */ hash[3] = hash[2] = hash[1] = hash[0] = 0xffff; ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto chipit; } @@ -827,6 +830,7 @@ bmac_setladrf(struct bmac_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/arch/macppc/dev/if_gm.c diff -u src/sys/arch/macppc/dev/if_gm.c:1.54 src/sys/arch/macppc/dev/if_gm.c:1.55 --- src/sys/arch/macppc/dev/if_gm.c:1.54 Thu May 23 10:57:27 2019 +++ src/sys/arch/macppc/dev/if_gm.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_gm.c,v 1.54 2019/05/23 10:57:27 msaitoh Exp $ */ +/* $NetBSD: if_gm.c,v 1.55 2019/05/28 07:41:47 msaitoh Exp $ */ /*- * Copyright (c) 2000 Tsubai Masanari. All rights reserved. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_gm.c,v 1.54 2019/05/23 10:57:27 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gm.c,v 1.55 2019/05/28 07:41:47 msaitoh Exp $"); #include "opt_inet.h" @@ -678,6 +678,7 @@ gmac_setladrf(struct gmac_softc *sc) * the word. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6)) { @@ -692,6 +693,7 @@ gmac_setladrf(struct gmac_softc *sc) for (i = 0; i < 16; i++) hash[i] = 0xffff; ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto chipit; } @@ -705,6 +707,7 @@ gmac_setladrf(struct gmac_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/arch/mips/adm5120/dev/if_admsw.c diff -u src/sys/arch/mips/adm5120/dev/if_admsw.c:1.23 src/sys/arch/mips/adm5120/dev/if_admsw.c:1.24 --- src/sys/arch/mips/adm5120/dev/if_admsw.c:1.23 Thu May 23 10:57:27 2019 +++ src/sys/arch/mips/adm5120/dev/if_admsw.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_admsw.c,v 1.23 2019/05/23 10:57:27 msaitoh Exp $ */ +/* $NetBSD: if_admsw.c,v 1.24 2019/05/28 07:41:47 msaitoh Exp $ */ /*- * Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko. @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_admsw.c,v 1.23 2019/05/23 10:57:27 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_admsw.c,v 1.24 2019/05/28 07:41:47 msaitoh Exp $"); #include <sys/param.h> @@ -1134,6 +1134,7 @@ admsw_set_filter(struct admsw_softc *sc) ifp->if_flags &= ~IFF_ALLMULTI; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, @@ -1167,6 +1168,7 @@ admsw_set_filter(struct admsw_softc *sc) /* Load h/w with mcast address, port = CPU */ ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); } conf = REG_READ(CPUP_CONF_REG); Index: src/sys/arch/mips/alchemy/dev/if_aumac.c diff -u src/sys/arch/mips/alchemy/dev/if_aumac.c:1.46 src/sys/arch/mips/alchemy/dev/if_aumac.c:1.47 --- src/sys/arch/mips/alchemy/dev/if_aumac.c:1.46 Thu May 23 10:51:38 2019 +++ src/sys/arch/mips/alchemy/dev/if_aumac.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_aumac.c,v 1.46 2019/05/23 10:51:38 msaitoh Exp $ */ +/* $NetBSD: if_aumac.c,v 1.47 2019/05/28 07:41:47 msaitoh Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_aumac.c,v 1.46 2019/05/23 10:51:38 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_aumac.c,v 1.47 2019/05/28 07:41:47 msaitoh Exp $"); @@ -924,6 +924,7 @@ aumac_set_filter(struct aumac_softc *sc) * The high order bits select the word, while the rest of the bits * select the bit within the word. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -935,6 +936,7 @@ aumac_set_filter(struct aumac_softc *sc) * ranges is for IP multicast routing, for which the * range is large enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -948,6 +950,7 @@ aumac_set_filter(struct aumac_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/arch/mips/atheros/dev/if_ae.c diff -u src/sys/arch/mips/atheros/dev/if_ae.c:1.35 src/sys/arch/mips/atheros/dev/if_ae.c:1.36 --- src/sys/arch/mips/atheros/dev/if_ae.c:1.35 Thu May 23 13:10:50 2019 +++ src/sys/arch/mips/atheros/dev/if_ae.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $Id: if_ae.c,v 1.35 2019/05/23 13:10:50 msaitoh Exp $ */ +/* $Id: if_ae.c,v 1.36 2019/05/28 07:41:47 msaitoh Exp $ */ /*- * Copyright (c) 2006 Urbana-Champaign Independent Media Center. * Copyright (c) 2006 Garrett D'Amore. @@ -98,7 +98,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ae.c,v 1.35 2019/05/23 13:10:50 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ae.c,v 1.36 2019/05/28 07:41:47 msaitoh Exp $"); #include <sys/param.h> @@ -1697,6 +1697,7 @@ ae_filter_setup(struct ae_softc *sc) mchash[0] = mchash[1] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1708,6 +1709,7 @@ ae_filter_setup(struct ae_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1716,6 +1718,7 @@ ae_filter_setup(struct ae_softc *sc) mchash[hash >> 5] |= 1 << (hash & 0x1f); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto setit; Index: src/sys/arch/mips/cavium/dev/octeon_gmx.c diff -u src/sys/arch/mips/cavium/dev/octeon_gmx.c:1.3 src/sys/arch/mips/cavium/dev/octeon_gmx.c:1.4 --- src/sys/arch/mips/cavium/dev/octeon_gmx.c:1.3 Sun Aug 20 11:05:24 2017 +++ src/sys/arch/mips/cavium/dev/octeon_gmx.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: octeon_gmx.c,v 1.3 2017/08/20 11:05:24 maxv Exp $ */ +/* $NetBSD: octeon_gmx.c,v 1.4 2019/05/28 07:41:47 msaitoh Exp $ */ /* * Copyright (c) 2007 Internet Initiative Japan, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: octeon_gmx.c,v 1.3 2017/08/20 11:05:24 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: octeon_gmx.c,v 1.4 2019/05/28 07:41:47 msaitoh Exp $"); #include "opt_octeon.h" @@ -922,7 +922,8 @@ octeon_gmx_rgmii_set_mac_addr(struct oct static int octeon_gmx_rgmii_set_filter(struct octeon_gmx_port_softc *sc) { - struct ifnet *ifp = &sc->sc_port_ec->ec_if; + struct ethercom *ec = &sc->sc_port_ec; + struct ifnet *ifp = &ec->ec_if; #ifdef OCTEON_ETH_USE_GMX_CAM struct ether_multi *enm; struct ether_multistep step; @@ -953,7 +954,8 @@ octeon_gmx_rgmii_set_filter(struct octeo * for multicast addresses. */ - ETHER_FIRST_MULTI(step, sc->sc_port_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { int i; @@ -969,6 +971,7 @@ octeon_gmx_rgmii_set_filter(struct octeo if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { dprintf("all multicast\n"); SET(ifp->if_flags, IFF_ALLMULTI); + ETHER_UNLOCK(ec); goto setmulti; } multi++; @@ -976,6 +979,7 @@ octeon_gmx_rgmii_set_filter(struct octeo /* XXX XXX XXX */ if (multi >= 8) { SET(ifp->if_flags, IFF_ALLMULTI); + ETHER_UNLOCK(ec); goto setmulti; } /* XXX XXX XXX */ @@ -1000,6 +1004,7 @@ octeon_gmx_rgmii_set_filter(struct octeo _GMX_PORT_RD8(sc, octeon_gmx_rx_adr_cam_regs[i])); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); CLR(ifp->if_flags, IFF_ALLMULTI); OCTEON_ETH_KASSERT(enm == NULL); Index: src/sys/arch/mips/sibyte/dev/sbmac.c diff -u src/sys/arch/mips/sibyte/dev/sbmac.c:1.59 src/sys/arch/mips/sibyte/dev/sbmac.c:1.60 --- src/sys/arch/mips/sibyte/dev/sbmac.c:1.59 Thu May 23 13:10:50 2019 +++ src/sys/arch/mips/sibyte/dev/sbmac.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sbmac.c,v 1.59 2019/05/23 13:10:50 msaitoh Exp $ */ +/* $NetBSD: sbmac.c,v 1.60 2019/05/28 07:41:47 msaitoh Exp $ */ /* * Copyright 2000, 2001, 2004 @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sbmac.c,v 1.59 2019/05/23 13:10:50 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sbmac.c,v 1.60 2019/05/28 07:41:47 msaitoh Exp $"); #include "opt_inet.h" #include "opt_ns.h" @@ -1894,6 +1894,7 @@ sbmac_setmulti(struct sbmac_softc *sc) */ idx = 1; /* skip station address */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while ((enm != NULL) && (idx < MAC_ADDR_COUNT)) { reg = sbmac_addr2reg(enm->enm_addrlo); @@ -1903,6 +1904,7 @@ sbmac_setmulti(struct sbmac_softc *sc) idx++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* * Enable the "accept multicast bits" if we programmed at least one Index: src/sys/arch/newsmips/apbus/if_sn.c diff -u src/sys/arch/newsmips/apbus/if_sn.c:1.44 src/sys/arch/newsmips/apbus/if_sn.c:1.45 --- src/sys/arch/newsmips/apbus/if_sn.c:1.44 Tue Feb 5 06:17:01 2019 +++ src/sys/arch/newsmips/apbus/if_sn.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_sn.c,v 1.44 2019/02/05 06:17:01 msaitoh Exp $ */ +/* $NetBSD: if_sn.c,v 1.45 2019/05/28 07:41:47 msaitoh Exp $ */ /* * National Semiconductor DP8393X SONIC Driver @@ -16,7 +16,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_sn.c,v 1.44 2019/02/05 06:17:01 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_sn.c,v 1.45 2019/05/28 07:41:47 msaitoh Exp $"); #include "opt_inet.h" @@ -623,6 +623,7 @@ camentry(struct sn_softc *sc, int entry, static void camprogram(struct sn_softc *sc) { + struct ethercom *ec = &sc->sc_ethercom; struct ether_multistep step; struct ether_multi *enm; struct ifnet *ifp; @@ -641,7 +642,8 @@ camprogram(struct sn_softc *sc) ifp->if_flags &= ~IFF_ALLMULTI; /* Loop through multicast addresses */ - ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (mcount == MAXCAM) { ifp->if_flags |= IFF_ALLMULTI; @@ -667,6 +669,7 @@ camprogram(struct sn_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); NIC_PUT(sc, SNR_CDP, LOWER(sc->v_cda)); NIC_PUT(sc, SNR_CDC, MAXCAM); Index: src/sys/arch/playstation2/dev/emac3.c diff -u src/sys/arch/playstation2/dev/emac3.c:1.13 src/sys/arch/playstation2/dev/emac3.c:1.14 --- src/sys/arch/playstation2/dev/emac3.c:1.13 Tue Jan 22 03:42:26 2019 +++ src/sys/arch/playstation2/dev/emac3.c Tue May 28 07:41:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: emac3.c,v 1.13 2019/01/22 03:42:26 msaitoh Exp $ */ +/* $NetBSD: emac3.c,v 1.14 2019/05/28 07:41:47 msaitoh Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: emac3.c,v 1.13 2019/01/22 03:42:26 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: emac3.c,v 1.14 2019/05/28 07:41:47 msaitoh Exp $"); #include "debug_playstation2.h" @@ -242,14 +242,18 @@ allmulti: return; } + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* XXX always multicast promiscuous mode. XXX use hash table.. */ ifp->if_flags |= IFF_ALLMULTI; Index: src/sys/arch/powerpc/booke/dev/pq3etsec.c diff -u src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.44 src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.45 --- src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.44 Thu May 23 10:51:39 2019 +++ src/sys/arch/powerpc/booke/dev/pq3etsec.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pq3etsec.c,v 1.44 2019/05/23 10:51:39 msaitoh Exp $ */ +/* $NetBSD: pq3etsec.c,v 1.45 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -41,7 +41,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.44 2019/05/23 10:51:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.45 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -1133,6 +1133,7 @@ pq3etsec_mc_setup( ifp->if_flags &= ~IFF_ALLMULTI; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); for (u_int i = 0; enm != NULL; ) { const char *addr = enm->enm_addrlo; @@ -1169,6 +1170,7 @@ pq3etsec_mc_setup( } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); for (u_int i = 0; i < 8; i++) { etsec_write(sc, IGADDR(i), sc->sc_gaddr[i]); etsec_write(sc, GADDR(i), sc->sc_gaddr[i+8]); Index: src/sys/arch/powerpc/ibm4xx/dev/if_emac.c diff -u src/sys/arch/powerpc/ibm4xx/dev/if_emac.c:1.50 src/sys/arch/powerpc/ibm4xx/dev/if_emac.c:1.51 --- src/sys/arch/powerpc/ibm4xx/dev/if_emac.c:1.50 Thu May 23 10:57:27 2019 +++ src/sys/arch/powerpc/ibm4xx/dev/if_emac.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_emac.c,v 1.50 2019/05/23 10:57:27 msaitoh Exp $ */ +/* $NetBSD: if_emac.c,v 1.51 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright 2001, 2002 Wasabi Systems, Inc. @@ -52,7 +52,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_emac.c,v 1.50 2019/05/23 10:57:27 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_emac.c,v 1.51 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_emac.h" @@ -1176,6 +1176,7 @@ emac_rxdrain(struct emac_softc *sc) static int emac_set_filter(struct emac_softc *sc) { + struct ethercom *ec = &sc->sc_ethercom; struct ether_multistep step; struct ether_multi *enm; struct ifnet *ifp = &sc->sc_ethercom.ec_if; @@ -1195,7 +1196,8 @@ emac_set_filter(struct emac_softc *sc) rmr &= ~(RMR_PMME | RMR_MAE); ifp->if_flags &= ~IFF_ALLMULTI; - ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN) != 0) { @@ -1222,6 +1224,7 @@ emac_set_filter(struct emac_softc *sc) ETHER_NEXT_MULTI(step, enm); cnt++; } + ETHER_UNLOCK(ec); for (i = 1, tmp = gaht[0]; i < regs; i++) tmp &= gaht[i]; Index: src/sys/arch/sgimips/mace/if_mec.c diff -u src/sys/arch/sgimips/mace/if_mec.c:1.59 src/sys/arch/sgimips/mace/if_mec.c:1.60 --- src/sys/arch/sgimips/mace/if_mec.c:1.59 Thu May 23 10:57:27 2019 +++ src/sys/arch/sgimips/mace/if_mec.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mec.c,v 1.59 2019/05/23 10:57:27 msaitoh Exp $ */ +/* $NetBSD: if_mec.c,v 1.60 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 2004, 2008 Izumi Tsutsui. All rights reserved. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mec.c,v 1.59 2019/05/23 10:57:27 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mec.c,v 1.60 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_ddb.h" @@ -1514,6 +1514,7 @@ mec_setfilter(struct mec_softc *sc) mcnt = 0; mchash = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1522,6 +1523,7 @@ mec_setfilter(struct mec_softc *sc) bus_space_write_8(st, sh, MEC_MULTICAST, 0xffffffffffffffffULL); bus_space_write_8(st, sh, MEC_MAC_CONTROL, control); + ETHER_UNLOCK(ec); return; } @@ -1532,6 +1534,7 @@ mec_setfilter(struct mec_softc *sc) mcnt++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/arch/sun3/dev/if_ie.c diff -u src/sys/arch/sun3/dev/if_ie.c:1.69 src/sys/arch/sun3/dev/if_ie.c:1.70 --- src/sys/arch/sun3/dev/if_ie.c:1.69 Thu May 23 13:10:51 2019 +++ src/sys/arch/sun3/dev/if_ie.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ie.c,v 1.69 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: if_ie.c,v 1.70 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1993, 1994, 1995 Charles M. Hannum. @@ -98,7 +98,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ie.c,v 1.69 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ie.c,v 1.70 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_inet.h" #include "opt_ns.h" @@ -1499,6 +1499,7 @@ ieioctl(struct ifnet *ifp, u_long cmd, v static void mc_reset(struct ie_softc *sc) { + struct ethercom *ec = &sc->sc_ethercom; struct ether_multi *enm; struct ether_multistep step; struct ifnet *ifp; @@ -1509,7 +1510,7 @@ mc_reset(struct ie_softc *sc) * Step through the list of addresses. */ sc->mcast_count = 0; - ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); + ETHER_FIRST_MULTI(step, ec, enm); while (enm) { if (sc->mcast_count >= MAXMCAST || ether_cmp(enm->enm_addrlo, enm->enm_addrhi) != 0) { @@ -1523,6 +1524,7 @@ mc_reset(struct ie_softc *sc) ETHER_NEXT_MULTI(step, enm); } setflag: + ETHER_UNLOCK(ec); sc->want_mcsetup = 1; } Index: src/sys/dev/bi/if_ni.c diff -u src/sys/dev/bi/if_ni.c:1.48 src/sys/dev/bi/if_ni.c:1.49 --- src/sys/dev/bi/if_ni.c:1.48 Thu May 23 13:10:51 2019 +++ src/sys/dev/bi/if_ni.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ni.c,v 1.48 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: if_ni.c,v 1.49 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 2000 Ludd, University of Lule}, Sweden. All rights reserved. * @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ni.c,v 1.48 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ni.c,v 1.49 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_inet.h" @@ -795,6 +795,7 @@ ni_add_rxbuf(struct ni_softc *sc, struct void ni_setup(struct ni_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ifnet *ifp = &sc->sc_if; struct ni_msg *msg; struct ni_ptdb *ptdb; @@ -824,7 +825,8 @@ ni_setup(struct ni_softc *sc) msg->nm_len += 8; ifp->if_flags &= ~IFF_ALLMULTI; if ((ifp->if_flags & IFF_PROMISC) == 0) { - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); i = 1; while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6)) { @@ -838,6 +840,7 @@ ni_setup(struct ni_softc *sc) ETHER_ADDR_LEN); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); } } else msg->nm_opcode2 = NI_CLPTDB; Index: src/sys/dev/cadence/if_cemac.c diff -u src/sys/dev/cadence/if_cemac.c:1.20 src/sys/dev/cadence/if_cemac.c:1.21 --- src/sys/dev/cadence/if_cemac.c:1.20 Thu May 23 13:10:51 2019 +++ src/sys/dev/cadence/if_cemac.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_cemac.c,v 1.20 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: if_cemac.c,v 1.21 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 2015 Genetec Corporation. All rights reserved. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_cemac.c,v 1.20 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_cemac.c,v 1.21 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -988,6 +988,7 @@ cemac_setaddr(struct ifnet *ifp) ifp->if_flags &= ~IFF_ALLMULTI; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1030,6 +1031,7 @@ cemac_setaddr(struct ifnet *ifp) ETHER_NEXT_MULTI(step, enm); nma++; } + ETHER_UNLOCK(ec); // program... DPRINTFN(1,("%s: en0 %02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, Index: src/sys/dev/ic/aic6915.c diff -u src/sys/dev/ic/aic6915.c:1.38 src/sys/dev/ic/aic6915.c:1.39 --- src/sys/dev/ic/aic6915.c:1.38 Thu May 23 10:51:39 2019 +++ src/sys/dev/ic/aic6915.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: aic6915.c,v 1.38 2019/05/23 10:51:39 msaitoh Exp $ */ +/* $NetBSD: aic6915.c,v 1.39 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: aic6915.c,v 1.38 2019/05/23 10:51:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: aic6915.c,v 1.39 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -1306,9 +1306,12 @@ sf_set_filter(struct sf_softc *sc) * Now set the hash bits for each multicast address in our * list. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); - if (enm == NULL) + if (enm == NULL) { + ETHER_UNLOCK(ec); goto done; + } while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { /* @@ -1319,11 +1322,13 @@ sf_set_filter(struct sf_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } sf_set_filter_hash(sc, enm->enm_addrlo); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* * Set "hash only multicast dest, match regardless of VLAN ID". Index: src/sys/dev/ic/mtd803.c diff -u src/sys/dev/ic/mtd803.c:1.38 src/sys/dev/ic/mtd803.c:1.39 --- src/sys/dev/ic/mtd803.c:1.38 Thu May 23 10:40:39 2019 +++ src/sys/dev/ic/mtd803.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: mtd803.c,v 1.38 2019/05/23 10:40:39 msaitoh Exp $ */ +/* $NetBSD: mtd803.c,v 1.39 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mtd803.c,v 1.38 2019/05/23 10:40:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mtd803.c,v 1.39 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -839,6 +839,7 @@ mtd_setmulti(struct mtd_softc *sc) return; } + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { /* We need the 6 most significant bits of the CRC */ @@ -849,6 +850,7 @@ mtd_setmulti(struct mtd_softc *sc) ++mcnt; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* Accept multicast bit needs to be on? */ if (mcnt) Index: src/sys/dev/ic/ath.c diff -u src/sys/dev/ic/ath.c:1.126 src/sys/dev/ic/ath.c:1.127 --- src/sys/dev/ic/ath.c:1.126 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/ath.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ath.c,v 1.126 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: ath.c,v 1.127 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting @@ -41,7 +41,7 @@ __FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.104 2005/09/16 10:09:23 ru Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: ath.c,v 1.126 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ath.c,v 1.127 2019/05/28 07:41:48 msaitoh Exp $"); #endif /* @@ -1989,6 +1989,7 @@ ath_calcrxfilter(struct ath_softc *sc, e static void ath_mode_init(struct ath_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ifnet *ifp = &sc->sc_if; struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; @@ -2028,7 +2029,8 @@ ath_mode_init(struct ath_softc *sc) /* calculate and install multicast filter */ ifp->if_flags &= ~IFF_ALLMULTI; mfilt[0] = mfilt[1] = 0; - ETHER_FIRST_MULTI(estep, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(estep, ec, enm); while (enm != NULL) { void *dl; /* XXX Punt on ranges. */ @@ -2047,6 +2049,7 @@ ath_mode_init(struct ath_softc *sc) ETHER_NEXT_MULTI(estep, enm); } + ETHER_UNLOCK(ec); ath_hal_setmcastfilter(ah, mfilt[0], mfilt[1]); DPRINTF(sc, ATH_DEBUG_MODE, "%s: RX filter 0x%x, MC filter %08x:%08x\n", Index: src/sys/dev/ic/athn.c diff -u src/sys/dev/ic/athn.c:1.20 src/sys/dev/ic/athn.c:1.21 --- src/sys/dev/ic/athn.c:1.20 Tue May 28 07:07:00 2019 +++ src/sys/dev/ic/athn.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: athn.c,v 1.20 2019/05/28 07:07:00 msaitoh Exp $ */ +/* $NetBSD: athn.c,v 1.21 2019/05/28 07:41:48 msaitoh Exp $ */ /* $OpenBSD: athn.c,v 1.83 2014/07/22 13:12:11 mpi Exp $ */ /*- @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: athn.c,v 1.20 2019/05/28 07:07:00 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: athn.c,v 1.21 2019/05/28 07:41:48 msaitoh Exp $"); #ifndef _MODULE #include "athn_usb.h" /* for NATHN_USB */ @@ -2737,6 +2737,7 @@ athn_set_multi(struct athn_softc *sc) goto done; } lo = hi = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) { @@ -2758,6 +2759,7 @@ athn_set_multi(struct athn_softc *sc) ETHER_NEXT_MULTI(step, enm); } done: + ETHER_UNLOCK(ec); AR_WRITE(sc, AR_MCAST_FIL0, lo); AR_WRITE(sc, AR_MCAST_FIL1, hi); AR_WRITE_BARRIER(sc); Index: src/sys/dev/ic/atw.c diff -u src/sys/dev/ic/atw.c:1.167 src/sys/dev/ic/atw.c:1.168 --- src/sys/dev/ic/atw.c:1.167 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/atw.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: atw.c,v 1.167 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: atw.c,v 1.168 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2002, 2003, 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.167 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.168 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -2012,17 +2012,21 @@ atw_filter_setup(struct atw_softc *sc) /* * Program the 64-bit multicast hash filter. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } hash = atw_calchash(enm->enm_addrlo); hashes[hash >> 5] |= 1 << (hash & 0x1f); ETHER_NEXT_MULTI(step, enm); sc->sc_opmode |= ATW_NAR_MM; } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto setit; Index: src/sys/dev/ic/awi.c diff -u src/sys/dev/ic/awi.c:1.97 src/sys/dev/ic/awi.c:1.98 --- src/sys/dev/ic/awi.c:1.97 Thu May 23 10:57:28 2019 +++ src/sys/dev/ic/awi.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: awi.c,v 1.97 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: awi.c,v 1.98 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1999,2000,2001 The NetBSD Foundation, Inc. @@ -78,7 +78,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.97 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.98 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_inet.h" @@ -1015,6 +1015,7 @@ awi_media_status(struct ifnet *ifp, stru static int awi_mode_init(struct awi_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ifnet *ifp = &sc->sc_if; int n, error; struct ether_multi *enm; @@ -1029,16 +1030,20 @@ awi_mode_init(struct awi_softc *sc) goto set_mib; } sc->sc_mib_mac.aPromiscuous_Enable = 0; - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (n == AWI_GROUP_ADDR_SIZE || - !IEEE80211_ADDR_EQ(enm->enm_addrlo, enm->enm_addrhi)) + !IEEE80211_ADDR_EQ(enm->enm_addrlo, enm->enm_addrhi)) { + ETHER_UNLOCK(ec); goto set_mib; + } IEEE80211_ADDR_COPY(sc->sc_mib_addr.aGroup_Addresses[n], enm->enm_addrlo); n++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); for (; n < AWI_GROUP_ADDR_SIZE; n++) memset(sc->sc_mib_addr.aGroup_Addresses[n], 0, IEEE80211_ADDR_LEN); Index: src/sys/dev/ic/cs89x0.c diff -u src/sys/dev/ic/cs89x0.c:1.45 src/sys/dev/ic/cs89x0.c:1.46 --- src/sys/dev/ic/cs89x0.c:1.45 Thu May 23 10:57:28 2019 +++ src/sys/dev/ic/cs89x0.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cs89x0.c,v 1.45 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: cs89x0.c,v 1.46 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 2004 Christopher Gilbert @@ -212,7 +212,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cs89x0.c,v 1.45 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cs89x0.c,v 1.46 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_inet.h" @@ -1250,6 +1250,7 @@ cs_set_ladr_filt(struct cs_softc *sc, st * addresses, in which case we will just accept all packets. * Justification for this is given in the next comment. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, @@ -1280,6 +1281,7 @@ cs_set_ladr_filt(struct cs_softc *sc, st ETHER_NEXT_MULTI(step, enm); } } + ETHER_UNLOCK(ec); /* Now program the chip with the addresses */ CS_WRITE_PACKET_PAGE(sc, PKTPG_LOG_ADDR + 0, af[0]); Index: src/sys/dev/ic/dm9000.c diff -u src/sys/dev/ic/dm9000.c:1.19 src/sys/dev/ic/dm9000.c:1.20 --- src/sys/dev/ic/dm9000.c:1.19 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/dm9000.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: dm9000.c,v 1.19 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: dm9000.c,v 1.20 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 2009 Paul Fleischer @@ -918,6 +918,7 @@ dme_set_addr_filter(struct dme_softc *sc af[0] = af[1] = af[2] = af[3] = 0x0000; ifp->if_flags &= ~IFF_ALLMULTI; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { uint16_t hash; @@ -940,6 +941,7 @@ dme_set_addr_filter(struct dme_softc *sc ETHER_NEXT_MULTI(step, enm); } } + ETHER_UNLOCK(ec); /* Write the multicast address filter */ for (i = 0; i < 4; i++) { Index: src/sys/dev/ic/dp8390.c diff -u src/sys/dev/ic/dp8390.c:1.93 src/sys/dev/ic/dp8390.c:1.94 --- src/sys/dev/ic/dp8390.c:1.93 Fri Apr 26 06:33:33 2019 +++ src/sys/dev/ic/dp8390.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: dp8390.c,v 1.93 2019/04/26 06:33:33 msaitoh Exp $ */ +/* $NetBSD: dp8390.c,v 1.94 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Device driver for National Semiconductor DS8390/WD83C690 based ethernet @@ -14,7 +14,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dp8390.c,v 1.93 2019/04/26 06:33:33 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dp8390.c,v 1.94 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_inet.h" @@ -960,6 +960,7 @@ dp8390_getmcaf(struct ethercom *ec, uint } for (i = 0; i < 8; i++) af[i] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, @@ -975,6 +976,7 @@ dp8390_getmcaf(struct ethercom *ec, uint ifp->if_flags |= IFF_ALLMULTI; for (i = 0; i < 8; i++) af[i] = 0xff; + ETHER_UNLOCK(ec); return; } @@ -988,6 +990,7 @@ dp8390_getmcaf(struct ethercom *ec, uint ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; } Index: src/sys/dev/ic/dp83932.c diff -u src/sys/dev/ic/dp83932.c:1.43 src/sys/dev/ic/dp83932.c:1.44 --- src/sys/dev/ic/dp83932.c:1.43 Thu May 23 10:57:28 2019 +++ src/sys/dev/ic/dp83932.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: dp83932.c,v 1.43 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: dp83932.c,v 1.44 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dp83932.c,v 1.43 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dp83932.c,v 1.44 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -1188,6 +1188,7 @@ sonic_set_filter(struct sonic_softc *sc) entry++; /* Add the multicast addresses to the CAM. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1196,6 +1197,7 @@ sonic_set_filter(struct sonic_softc *sc) * The only way to do this on the SONIC is to enable * reception of all multicast packets. */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1204,6 +1206,7 @@ sonic_set_filter(struct sonic_softc *sc) * Out of CAM slots. Have to enable reception * of all multicast addresses. */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1213,6 +1216,7 @@ sonic_set_filter(struct sonic_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto setit; Index: src/sys/dev/ic/elinkxl.c diff -u src/sys/dev/ic/elinkxl.c:1.130 src/sys/dev/ic/elinkxl.c:1.131 --- src/sys/dev/ic/elinkxl.c:1.130 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/elinkxl.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: elinkxl.c,v 1.130 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: elinkxl.c,v 1.131 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: elinkxl.c,v 1.130 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: elinkxl.c,v 1.131 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -723,13 +723,18 @@ ex_set_mc(struct ex_softc *sc) goto allmulti; } + ETHER_LOCK(ec); ETHER_FIRST_MULTI(estep, ec, enm); - if (enm == NULL) + if (enm == NULL) { + ETHER_UNLOCK(ec); goto nomulti; + } - if ((sc->ex_conf & EX_CONF_90XB) == 0) + if ((sc->ex_conf & EX_CONF_90XB) == 0) { /* No multicast hash filtering. */ + ETHER_UNLOCK(ec); goto allmulti; + } for (i = 0; i < MCHASHSIZE; i++) bus_space_write_2(sc->sc_iot, sc->sc_ioh, @@ -737,14 +742,17 @@ ex_set_mc(struct ex_softc *sc) do { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } i = ex_mchash(enm->enm_addrlo); bus_space_write_2(sc->sc_iot, sc->sc_ioh, ELINK_COMMAND, ELINK_SETHASHFILBIT | i); ETHER_NEXT_MULTI(estep, enm); } while (enm != NULL); + ETHER_UNLOCK(ec); mask |= FIL_MULTIHASH; nomulti: Index: src/sys/dev/ic/gem.c diff -u src/sys/dev/ic/gem.c:1.118 src/sys/dev/ic/gem.c:1.119 --- src/sys/dev/ic/gem.c:1.118 Fri May 24 06:26:38 2019 +++ src/sys/dev/ic/gem.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gem.c,v 1.118 2019/05/24 06:26:38 msaitoh Exp $ */ +/* $NetBSD: gem.c,v 1.119 2019/05/28 07:41:48 msaitoh Exp $ */ /* * @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.118 2019/05/24 06:26:38 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.119 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_inet.h" @@ -2744,6 +2744,7 @@ gem_setladrf(struct gem_softc *sc) /* Clear hash table */ memset(hash, 0, sizeof(hash)); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -2758,6 +2759,7 @@ gem_setladrf(struct gem_softc *sc) */ ifp->if_flags |= IFF_ALLMULTI; v |= GEM_MAC_RX_PROMISC_GRP; + ETHER_UNLOCK(ec); goto chipit; } @@ -2772,6 +2774,7 @@ gem_setladrf(struct gem_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); v |= GEM_MAC_RX_HASH_FILTER; ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/ic/hme.c diff -u src/sys/dev/ic/hme.c:1.104 src/sys/dev/ic/hme.c:1.105 --- src/sys/dev/ic/hme.c:1.104 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/hme.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: hme.c,v 1.104 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: hme.c,v 1.105 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.104 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.105 2019/05/28 07:41:48 msaitoh Exp $"); /* #define HMEDEBUG */ @@ -1568,6 +1568,7 @@ hme_setladrf(struct hme_softc *sc) * the word. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1581,6 +1582,7 @@ hme_setladrf(struct hme_softc *sc) */ hash[3] = hash[2] = hash[1] = hash[0] = 0xffff; ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto chipit; } @@ -1594,6 +1596,7 @@ hme_setladrf(struct hme_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/ic/i82557.c diff -u src/sys/dev/ic/i82557.c:1.152 src/sys/dev/ic/i82557.c:1.153 --- src/sys/dev/ic/i82557.c:1.152 Thu May 23 10:51:39 2019 +++ src/sys/dev/ic/i82557.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i82557.c,v 1.152 2019/05/23 10:51:39 msaitoh Exp $ */ +/* $NetBSD: i82557.c,v 1.153 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1997, 1998, 1999, 2001, 2002 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i82557.c,v 1.152 2019/05/23 10:51:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i82557.c,v 1.153 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -2227,6 +2227,7 @@ fxp_mc_setup(struct fxp_softc *sc) * Initialize multicast setup descriptor. */ nmcasts = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { /* @@ -2247,6 +2248,7 @@ fxp_mc_setup(struct fxp_softc *sc) * the config block. */ ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); return; } memcpy(&mcsp->mc_addr[nmcasts][0], enm->enm_addrlo, @@ -2254,6 +2256,7 @@ fxp_mc_setup(struct fxp_softc *sc) nmcasts++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* BIG_ENDIAN: no need to swap to store 0 */ mcsp->cb_status = 0; Index: src/sys/dev/ic/i82586.c diff -u src/sys/dev/ic/i82586.c:1.83 src/sys/dev/ic/i82586.c:1.84 --- src/sys/dev/ic/i82586.c:1.83 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/i82586.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i82586.c,v 1.83 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: i82586.c,v 1.84 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -137,7 +137,7 @@ Mode of operation: */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i82586.c,v 1.83 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i82586.c,v 1.84 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -1769,6 +1769,7 @@ ie_mc_reset(struct ie_softc *sc) again: size = 0; sc->mcast_count = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm) { size += 6; @@ -1776,10 +1777,12 @@ again: memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) { ec->ec_if.if_flags |= IFF_ALLMULTI; i82586_ioctl(&ec->ec_if, SIOCSIFFLAGS, NULL); + ETHER_UNLOCK(ec); return; } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); if (size > sc->mcast_addrs_size) { /* Need to allocate more space */ @@ -1793,15 +1796,19 @@ again: /* * We've got the space; now copy the addresses */ - ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm) { - if (sc->mcast_count >= IE_MAXMCAST) + if (sc->mcast_count >= IE_MAXMCAST) { + ETHER_UNLOCK(ec); goto again; /* Just in case */ + } memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6); sc->mcast_count++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); sc->want_mcsetup = 1; } Index: src/sys/dev/ic/i82596.c diff -u src/sys/dev/ic/i82596.c:1.40 src/sys/dev/ic/i82596.c:1.41 --- src/sys/dev/ic/i82596.c:1.40 Fri Apr 26 06:33:34 2019 +++ src/sys/dev/ic/i82596.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i82596.c,v 1.40 2019/04/26 06:33:34 msaitoh Exp $ */ +/* $NetBSD: i82596.c,v 1.41 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 2003 Jochen Kunz. @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i82596.c,v 1.40 2019/04/26 06:33:34 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i82596.c,v 1.41 2019/05/28 07:41:48 msaitoh Exp $"); /* autoconfig and device stuff */ #include <sys/param.h> @@ -466,7 +466,8 @@ void iee_cb_setup(struct iee_softc *sc, uint32_t cmd) { struct iee_cb *cb = SC_CB(sc, sc->sc_next_cb); - struct ifnet *ifp = &sc->sc_ethercom.ec_if; + struct ethercom *ec = &sc->sc_ethercom; + struct ifnet *ifp = &ec->ec_if; struct ether_multistep step; struct ether_multi *enm; @@ -499,7 +500,8 @@ iee_cb_setup(struct iee_softc *sc, uint3 cb = SC_CB(sc, sc->sc_next_cb + 1); cb->cb_cmd = cmd; cb->cb_mcast.mc_size = 0; - ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN) != 0 || cb->cb_mcast.mc_size @@ -515,6 +517,7 @@ iee_cb_setup(struct iee_softc *sc, uint3 ETHER_NEXT_MULTI(step, enm); cb->cb_mcast.mc_size += ETHER_ADDR_LEN; } + ETHER_UNLOCK(ec); if (cb->cb_mcast.mc_size == 0) { /* Can't do exact mcast filtering, do ALLMULTI mode. */ ifp->if_flags |= IFF_ALLMULTI; Index: src/sys/dev/ic/lan9118.c diff -u src/sys/dev/ic/lan9118.c:1.33 src/sys/dev/ic/lan9118.c:1.34 --- src/sys/dev/ic/lan9118.c:1.33 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/lan9118.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: lan9118.c,v 1.33 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: lan9118.c,v 1.34 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 2008 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lan9118.c,v 1.33 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lan9118.c,v 1.34 2019/05/28 07:41:48 msaitoh Exp $"); /* * The LAN9118 Family @@ -865,9 +865,10 @@ lan9118_mac_writereg(struct lan9118_soft static void lan9118_set_filter(struct lan9118_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ether_multistep step; struct ether_multi *enm; - struct ifnet *ifp = &sc->sc_ec.ec_if; + struct ifnet *ifp = &ec->ec_if; uint32_t mac_cr, h, hashes[2] = { 0, 0 }; mac_cr = lan9118_mac_readreg(sc, LAN9118_MAC_CR); @@ -885,7 +886,8 @@ lan9118_set_filter(struct lan9118_softc if (ifp->if_flags & IFF_ALLMULTI) mac_cr |= LAN9118_MAC_CR_MCPAS; else { - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN) != 0) { @@ -910,6 +912,7 @@ lan9118_set_filter(struct lan9118_softc mac_cr |= LAN9118_MAC_CR_HPFILT; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); if (mac_cr & LAN9118_MAC_CR_HPFILT) { lan9118_mac_writereg(sc, LAN9118_HASHH, hashes[1]); lan9118_mac_writereg(sc, LAN9118_HASHL, hashes[0]); Index: src/sys/dev/ic/lance.c diff -u src/sys/dev/ic/lance.c:1.56 src/sys/dev/ic/lance.c:1.57 --- src/sys/dev/ic/lance.c:1.56 Thu May 23 10:30:36 2019 +++ src/sys/dev/ic/lance.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: lance.c,v 1.56 2019/05/23 10:30:36 msaitoh Exp $ */ +/* $NetBSD: lance.c,v 1.57 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lance.c,v 1.56 2019/05/23 10:30:36 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lance.c,v 1.57 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -581,6 +581,8 @@ lance_setladrf(struct ethercom *ec, uint goto allmulti; af[0] = af[1] = af[2] = af[3] = 0x0000; + + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (ETHER_CMP(enm->enm_addrlo, enm->enm_addrhi)) { @@ -592,6 +594,7 @@ lance_setladrf(struct ethercom *ec, uint * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -605,6 +608,7 @@ lance_setladrf(struct ethercom *ec, uint ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; return; Index: src/sys/dev/ic/lemac.c diff -u src/sys/dev/ic/lemac.c:1.52 src/sys/dev/ic/lemac.c:1.53 --- src/sys/dev/ic/lemac.c:1.52 Thu May 23 10:57:28 2019 +++ src/sys/dev/ic/lemac.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: lemac.c,v 1.52 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: lemac.c,v 1.53 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1994, 1995, 1997 Matt Thomas <m...@3am-software.com> @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lemac.c,v 1.52 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lemac.c,v 1.53 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_inet.h" @@ -435,6 +435,7 @@ lemac_multicast_op( static void lemac_multicast_filter(lemac_softc_t *sc) { + struct ethercom *ec = &sc->sc_ec; struct ether_multistep step; struct ether_multi *enm; @@ -442,16 +443,19 @@ lemac_multicast_filter(lemac_softc_t *sc lemac_multicast_op(sc->sc_mctbl, etherbroadcastaddr, TRUE); - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (!LEMAC_ADDREQUAL(enm->enm_addrlo, enm->enm_addrhi)) { sc->sc_flags |= LEMAC_ALLMULTI; sc->sc_if.if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); return; } lemac_multicast_op(sc->sc_mctbl, enm->enm_addrlo, TRUE); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); sc->sc_flags &= ~LEMAC_ALLMULTI; sc->sc_if.if_flags &= ~IFF_ALLMULTI; } Index: src/sys/dev/ic/mb86960.c diff -u src/sys/dev/ic/mb86960.c:1.91 src/sys/dev/ic/mb86960.c:1.92 --- src/sys/dev/ic/mb86960.c:1.91 Thu May 23 10:57:28 2019 +++ src/sys/dev/ic/mb86960.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: mb86960.c,v 1.91 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: mb86960.c,v 1.92 2019/05/28 07:41:48 msaitoh Exp $ */ /* * All Rights Reserved, Copyright (C) Fujitsu Limited 1995 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mb86960.c,v 1.91 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mb86960.c,v 1.92 2019/05/28 07:41:48 msaitoh Exp $"); /* * Device driver for Fujitsu MB86960A/MB86965A based Ethernet cards. @@ -1551,6 +1551,7 @@ mb86960_getmcaf(struct ethercom *ec, uin goto allmulti; memset(af, 0, FE_FILTER_LEN); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, @@ -1563,6 +1564,7 @@ mb86960_getmcaf(struct ethercom *ec, uin * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1576,6 +1578,7 @@ mb86960_getmcaf(struct ethercom *ec, uin ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; return; Index: src/sys/dev/ic/pdq_ifsubr.c diff -u src/sys/dev/ic/pdq_ifsubr.c:1.65 src/sys/dev/ic/pdq_ifsubr.c:1.66 --- src/sys/dev/ic/pdq_ifsubr.c:1.65 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/pdq_ifsubr.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pdq_ifsubr.c,v 1.65 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: pdq_ifsubr.c,v 1.66 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1995, 1996 Matt Thomas <m...@3am-software.com> @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pdq_ifsubr.c,v 1.65 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pdq_ifsubr.c,v 1.66 2019/05/28 07:41:48 msaitoh Exp $"); #ifdef __NetBSD__ #include "opt_inet.h" @@ -270,6 +270,7 @@ void pdq_os_addr_fill(pdq_t *pdq, pdq_lanaddr_t *addr, size_t num_addrs) { pdq_softc_t *sc = pdq->pdq_os_ctx; + struct ethercom *ec = PDQ_FDDICOM(sc); struct ether_multistep step; struct ether_multi *enm; @@ -284,7 +285,8 @@ pdq_os_addr_fill(pdq_t *pdq, pdq_lanaddr sc->sc_if.if_flags &= ~IFF_ALLMULTI; #endif - ETHER_FIRST_MULTI(step, PDQ_FDDICOM(sc), enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL && num_addrs > 0) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) == 0) { ((u_short *)addr->lanaddr_bytes)[0] = ((u_short *)enm->enm_addrlo)[0]; @@ -300,6 +302,7 @@ pdq_os_addr_fill(pdq_t *pdq, pdq_lanaddr } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* * If not all the address fit into the CAM, turn on all-multicast mode. */ Index: src/sys/dev/ic/rtl81x9.c diff -u src/sys/dev/ic/rtl81x9.c:1.105 src/sys/dev/ic/rtl81x9.c:1.106 --- src/sys/dev/ic/rtl81x9.c:1.105 Thu May 23 10:51:39 2019 +++ src/sys/dev/ic/rtl81x9.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rtl81x9.c,v 1.105 2019/05/23 10:51:39 msaitoh Exp $ */ +/* $NetBSD: rtl81x9.c,v 1.106 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 1997, 1998 @@ -86,7 +86,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtl81x9.c,v 1.105 2019/05/23 10:51:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtl81x9.c,v 1.106 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -524,15 +524,14 @@ rtk_phy_statchg(struct ifnet *ifp) void rtk_setmulti(struct rtk_softc *sc) { - struct ifnet *ifp; + struct ethercom *ec = &sc->ethercom; + struct ifnet *ifp = &ec->ec_if; uint32_t hashes[2] = { 0, 0 }; uint32_t rxfilt; struct ether_multi *enm; struct ether_multistep step; int h, mcnt; - ifp = &sc->ethercom.ec_if; - rxfilt = CSR_READ_4(sc, RTK_RXCFG); if (ifp->if_flags & IFF_PROMISC) { @@ -550,12 +549,15 @@ rtk_setmulti(struct rtk_softc *sc) CSR_WRITE_4(sc, RTK_MAR4, 0); /* now program new ones */ - ETHER_FIRST_MULTI(step, &sc->ethercom, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); mcnt = 0; while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } h = rtk_calchash(enm->enm_addrlo); if (h < 32) @@ -565,6 +567,7 @@ rtk_setmulti(struct rtk_softc *sc) mcnt++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/ic/rtw.c diff -u src/sys/dev/ic/rtw.c:1.132 src/sys/dev/ic/rtw.c:1.133 --- src/sys/dev/ic/rtw.c:1.132 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/rtw.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rtw.c,v 1.132 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: rtw.c,v 1.133 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 David Young. All rights * reserved. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.132 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.133 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -2718,6 +2718,7 @@ rtw_pktfilt_load(struct rtw_softc *sc) /* * Program the 64-bit multicast hash filter. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { /* XXX */ @@ -2731,6 +2732,7 @@ rtw_pktfilt_load(struct rtw_softc *sc) hashes[hash >> 5] |= (1 << (hash & 0x1f)); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* XXX accept all broadcast if scanning */ if ((ifp->if_flags & IFF_BROADCAST) != 0) Index: src/sys/dev/ic/seeq8005.c diff -u src/sys/dev/ic/seeq8005.c:1.63 src/sys/dev/ic/seeq8005.c:1.64 --- src/sys/dev/ic/seeq8005.c:1.63 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/seeq8005.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: seeq8005.c,v 1.63 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: seeq8005.c,v 1.64 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 2000, 2001 Ben Harris @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: seeq8005.c,v 1.63 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: seeq8005.c,v 1.64 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -556,7 +556,8 @@ ea_await_fifo_empty(struct seeq8005_soft if (SEEQ_READ16(sc, iot, ioh, SEEQ_STATUS) & SEEQ_STATUS_FIFO_EMPTY) return; - log(LOG_ERR, "%s: DMA FIFO failed to empty\n", device_xname(sc->sc_dev)); + log(LOG_ERR, "%s: DMA FIFO failed to empty\n", + device_xname(sc->sc_dev)); } /* @@ -1396,6 +1397,8 @@ ea_mc_reset_8004(struct seeq8005_softc * } for (i = 0; i < 8; i++) af[i] = 0; + + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, @@ -1424,6 +1427,7 @@ ea_mc_reset_8004(struct seeq8005_softc * ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; ea_select_buffer(sc, SEEQ_BUFCODE_MULTICAST); @@ -1442,12 +1446,14 @@ ea_mc_reset_8005(struct seeq8005_softc * naddr = 0; maxaddrs = 5; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { /* Have we got space? */ if (naddr >= maxaddrs || memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) { ec->ec_if.if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); ea_ioctl(&ec->ec_if, SIOCSIFFLAGS, NULL); return; } @@ -1456,6 +1462,8 @@ ea_mc_reset_8005(struct seeq8005_softc * naddr++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); + for (; naddr < maxaddrs; naddr++) sc->sc_config1 &= ~(SEEQ_CFG1_STATION_ADDR1 << naddr); SEEQ_WRITE16(sc, sc->sc_iot, sc->sc_ioh, SEEQ_CONFIG1, Index: src/sys/dev/ic/sgec.c diff -u src/sys/dev/ic/sgec.c:1.50 src/sys/dev/ic/sgec.c:1.51 --- src/sys/dev/ic/sgec.c:1.50 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/sgec.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sgec.c,v 1.50 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: sgec.c,v 1.51 2019/05/28 07:41:48 msaitoh Exp $ */ /* * Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved. * @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sgec.c,v 1.50 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sgec.c,v 1.51 2019/05/28 07:41:48 msaitoh Exp $"); #include "opt_inet.h" @@ -650,6 +650,7 @@ ze_add_rxbuf(struct ze_softc *sc, int i) void ze_setup(struct ze_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ether_multi *enm; struct ether_multistep step; struct ze_cdata *zc = sc->sc_zedata; @@ -674,7 +675,8 @@ ze_setup(struct ze_softc *sc) */ j = 16; ifp->if_flags &= ~IFF_ALLMULTI; - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6)) { ifp->if_flags |= IFF_ALLMULTI; @@ -688,6 +690,7 @@ ze_setup(struct ze_softc *sc) break; } } + ETHER_UNLOCK(ec); /* * ALLMULTI implies PROMISC in this driver. Index: src/sys/dev/ic/smc83c170.c diff -u src/sys/dev/ic/smc83c170.c:1.89 src/sys/dev/ic/smc83c170.c:1.90 --- src/sys/dev/ic/smc83c170.c:1.89 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/smc83c170.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: smc83c170.c,v 1.89 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: smc83c170.c,v 1.90 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: smc83c170.c,v 1.89 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: smc83c170.c,v 1.90 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -1278,6 +1278,7 @@ epic_set_mchash(struct epic_softc *sc) mchash[0] = mchash[1] = mchash[2] = mchash[3] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1289,6 +1290,7 @@ epic_set_mchash(struct epic_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1300,6 +1302,7 @@ epic_set_mchash(struct epic_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto sethash; Index: src/sys/dev/ic/tulip.c diff -u src/sys/dev/ic/tulip.c:1.195 src/sys/dev/ic/tulip.c:1.196 --- src/sys/dev/ic/tulip.c:1.195 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/tulip.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: tulip.c,v 1.195 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: tulip.c,v 1.196 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2002 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tulip.c,v 1.195 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tulip.c,v 1.196 2019/05/28 07:41:48 msaitoh Exp $"); #include <sys/param.h> @@ -2613,6 +2613,7 @@ tlp_filter_setup(struct tulip_softc *sc) sp = TULIP_CDSP(sc); memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN); cnt = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -2624,6 +2625,7 @@ tlp_filter_setup(struct tulip_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } if (cnt == (TULIP_MAXADDRS - 2)) { @@ -2632,6 +2634,7 @@ tlp_filter_setup(struct tulip_softc *sc) * our station address and broadcast). Go to * Hash-Perfect mode. */ + ETHER_UNLOCK(ec); goto hashperfect; } cnt++; @@ -2640,6 +2643,7 @@ tlp_filter_setup(struct tulip_softc *sc) *sp++ = htole32(TULIP_SP_FIELD(enm->enm_addrlo, 2)); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); if (ifp->if_flags & IFF_BROADCAST) { /* ...and the broadcast address. */ @@ -2674,6 +2678,7 @@ tlp_filter_setup(struct tulip_softc *sc) sc->sc_filtmode = TDCTL_Tx_FT_HASH; sp = TULIP_CDSP(sc); memset(TULIP_CDSP(sc), 0, TULIP_SETUP_PACKET_LEN); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -2685,12 +2690,14 @@ tlp_filter_setup(struct tulip_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } hash = tlp_mchash(enm->enm_addrlo, hashsize); sp[hash >> 4] |= htole32(1 << (hash & 0xf)); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); if (ifp->if_flags & IFF_BROADCAST) { /* ...and the broadcast address. */ @@ -2919,6 +2926,7 @@ tlp_al981_filter_setup(struct tulip_soft mchash[0] = mchash[1] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -2930,6 +2938,7 @@ tlp_al981_filter_setup(struct tulip_soft * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -2937,6 +2946,7 @@ tlp_al981_filter_setup(struct tulip_soft mchash[hash >> 5] |= 1 << (hash & 0x1f); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto setit; @@ -2984,6 +2994,7 @@ tlp_asix_filter_setup(struct tulip_softc mchash[0] = mchash[1] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -2995,6 +3006,7 @@ tlp_asix_filter_setup(struct tulip_softc * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } hash = (ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26) @@ -3005,6 +3017,7 @@ tlp_asix_filter_setup(struct tulip_softc mchash[1] |= (1 << (hash - 32)); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto setit; Index: src/sys/dev/ic/wi.c diff -u src/sys/dev/ic/wi.c:1.252 src/sys/dev/ic/wi.c:1.253 --- src/sys/dev/ic/wi.c:1.252 Thu May 23 13:10:51 2019 +++ src/sys/dev/ic/wi.c Tue May 28 07:41:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: wi.c,v 1.252 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: wi.c,v 1.253 2019/05/28 07:41:48 msaitoh Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.252 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.253 2019/05/28 07:41:48 msaitoh Exp $"); #define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */ #define WI_HERMES_STATS_WAR /* Work around stats counter bug. */ @@ -2109,6 +2109,7 @@ wi_info_intr(struct wi_softc *sc) STATIC int wi_write_multi(struct wi_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ifnet *ifp = &sc->sc_if; int n; struct wi_mcast mlist; @@ -2124,17 +2125,21 @@ allmulti: } n = 0; - ETHER_FIRST_MULTI(estep, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(estep, ec, enm); while (enm != NULL) { /* Punt on ranges or too many multicast addresses. */ if (!IEEE80211_ADDR_EQ(enm->enm_addrlo, enm->enm_addrhi) || - n >= sizeof(mlist) / sizeof(mlist.wi_mcast[0])) + n >= sizeof(mlist) / sizeof(mlist.wi_mcast[0])) { + ETHER_UNLOCK(ec); goto allmulti; + } IEEE80211_ADDR_COPY(&mlist.wi_mcast[n], enm->enm_addrlo); n++; ETHER_NEXT_MULTI(estep, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; return wi_write_rid(sc, WI_RID_MCAST_LIST, &mlist, IEEE80211_ADDR_LEN * n); Index: src/sys/dev/isa/if_iy.c diff -u src/sys/dev/isa/if_iy.c:1.107 src/sys/dev/isa/if_iy.c:1.108 --- src/sys/dev/isa/if_iy.c:1.107 Thu May 23 13:10:51 2019 +++ src/sys/dev/isa/if_iy.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iy.c,v 1.107 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: if_iy.c,v 1.108 2019/05/28 07:41:49 msaitoh Exp $ */ /* #define IYDEBUG */ /* #define IYMEMDEBUG */ @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iy.c,v 1.107 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iy.c,v 1.108 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" @@ -1333,6 +1333,7 @@ iy_mc_setup(struct iy_softc *sc) bus_space_write_2(iot, ioh, MEM_PORT_REG, 0); bus_space_write_stream_2(iot, ioh, MEM_PORT_REG, htole16(len)); + ETHER_LOCK(ecp); ETHER_FIRST_MULTI(step, ecp, enm); while (enm) { /* @@ -1343,6 +1344,7 @@ iy_mc_setup(struct iy_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ecp); dum = bus_space_read_2(iot, ioh, MEM_PORT_REG); /* dummy read */ __USE(dum); bus_space_write_2(iot, ioh, XMT_ADDR_REG, last); @@ -1400,14 +1402,17 @@ iy_mc_reset(struct iy_softc *sc) /* * Step through the list of addresses. */ + ETHER_LOCK(ecp); ETHER_FIRST_MULTI(step, ecp, enm); while (enm) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) { ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ecp); goto setupmulti; } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ecp); /* OK, we really need to do it now: */ #if 0 if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) Index: src/sys/dev/marvell/if_gfe.c diff -u src/sys/dev/marvell/if_gfe.c:1.53 src/sys/dev/marvell/if_gfe.c:1.54 --- src/sys/dev/marvell/if_gfe.c:1.53 Thu May 23 13:10:51 2019 +++ src/sys/dev/marvell/if_gfe.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_gfe.c,v 1.53 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: if_gfe.c,v 1.54 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2002 Allegro Networks, Inc., Wasabi Systems, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_gfe.c,v 1.53 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gfe.c,v 1.54 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" @@ -2024,6 +2024,7 @@ gfe_hash_fill(struct gfe_softc *sc) sc->sc_flags &= ~GE_ALLMULTI; if ((ec->ec_if.if_flags & IFF_PROMISC) == 0) sc->sc_pcr &= ~ETH_EPCR_PM; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -2037,6 +2038,7 @@ gfe_hash_fill(struct gfe_softc *sc) } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); GE_FUNC_EXIT(sc, ""); return error; Index: src/sys/dev/marvell/if_mvgbe.c diff -u src/sys/dev/marvell/if_mvgbe.c:1.56 src/sys/dev/marvell/if_mvgbe.c:1.57 --- src/sys/dev/marvell/if_mvgbe.c:1.56 Thu May 23 13:10:51 2019 +++ src/sys/dev/marvell/if_mvgbe.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mvgbe.c,v 1.56 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: if_mvgbe.c,v 1.57 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2007, 2008, 2013 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.56 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.57 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_multiprocessor.h" @@ -2180,10 +2180,12 @@ mvgbe_filter_setup(struct mvgbe_softc *s goto allmulti; } + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { /* ranges are complex and somewhat rare */ + ETHER_UNLOCK(ec); goto allmulti; } /* chip handles some IPv4 multicast specially */ @@ -2199,6 +2201,7 @@ mvgbe_filter_setup(struct mvgbe_softc *s ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); goto set; allmulti: Index: src/sys/dev/marvell/if_mvxpe.c diff -u src/sys/dev/marvell/if_mvxpe.c:1.26 src/sys/dev/marvell/if_mvxpe.c:1.27 --- src/sys/dev/marvell/if_mvxpe.c:1.26 Fri May 24 06:26:38 2019 +++ src/sys/dev/marvell/if_mvxpe.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mvxpe.c,v 1.26 2019/05/24 06:26:38 msaitoh Exp $ */ +/* $NetBSD: if_mvxpe.c,v 1.27 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2015 Internet Initiative Japan Inc. * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mvxpe.c,v 1.26 2019/05/24 06:26:38 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mvxpe.c,v 1.27 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_multiprocessor.h" @@ -2717,10 +2717,12 @@ mvxpe_filter_setup(struct mvxpe_softc *s goto allmulti; } + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { /* ranges are complex and somewhat rare */ + ETHER_UNLOCK(ec); goto allmulti; } /* chip handles some IPv4 multicast specially */ @@ -2736,6 +2738,7 @@ mvxpe_filter_setup(struct mvxpe_softc *s ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); goto set; allmulti: Index: src/sys/dev/pci/if_age.c diff -u src/sys/dev/pci/if_age.c:1.58 src/sys/dev/pci/if_age.c:1.59 --- src/sys/dev/pci/if_age.c:1.58 Thu May 23 13:10:51 2019 +++ src/sys/dev/pci/if_age.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_age.c,v 1.58 2019/05/23 13:10:51 msaitoh Exp $ */ +/* $NetBSD: if_age.c,v 1.59 2019/05/28 07:41:49 msaitoh Exp $ */ /* $OpenBSD: if_age.c,v 1.1 2009/01/16 05:00:34 kevlo Exp $ */ /*- @@ -31,7 +31,7 @@ /* Driver for Attansic Technology Corp. L1 Gigabit Ethernet. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.58 2019/05/23 13:10:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.59 2019/05/28 07:41:49 msaitoh Exp $"); #include "vlan.h" @@ -2287,12 +2287,14 @@ age_rxfilter(struct age_softc *sc) /* Program new filter. */ memset(mchash, 0, sizeof(mchash)); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN); mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); } CSR_WRITE_4(sc, AGE_MAR0, mchash[0]); Index: src/sys/dev/pci/if_alc.c diff -u src/sys/dev/pci/if_alc.c:1.36 src/sys/dev/pci/if_alc.c:1.37 --- src/sys/dev/pci/if_alc.c:1.36 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_alc.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_alc.c,v 1.36 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_alc.c,v 1.37 2019/05/28 07:41:49 msaitoh Exp $ */ /* $OpenBSD: if_alc.c,v 1.1 2009/08/08 09:31:13 kevlo Exp $ */ /*- * Copyright (c) 2009, Pyun YongHyeon <yong...@freebsd.org> @@ -3428,12 +3428,14 @@ alc_iff(struct alc_softc *sc) /* Program new filter. */ memset(mchash, 0, sizeof(mchash)); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { crc = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN); mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); } CSR_WRITE_4(sc, ALC_MAR0, mchash[0]); Index: src/sys/dev/pci/if_kse.c diff -u src/sys/dev/pci/if_kse.c:1.36 src/sys/dev/pci/if_kse.c:1.37 --- src/sys/dev/pci/if_kse.c:1.36 Thu May 23 10:40:39 2019 +++ src/sys/dev/pci/if_kse.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_kse.c,v 1.36 2019/05/23 10:40:39 msaitoh Exp $ */ +/* $NetBSD: if_kse.c,v 1.37 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1.36 2019/05/23 10:40:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1.37 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> @@ -1032,9 +1032,12 @@ kse_set_filter(struct kse_softc *sc) if (ifp->if_flags & IFF_PROMISC) return; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); - if (enm == NULL) + if (enm == NULL) { + ETHER_UNLOCK(ec); return; + } hashes[0] = hashes[1] = 0; do { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1046,12 +1049,14 @@ kse_set_filter(struct kse_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } h = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26; hashes[h >> 5] |= 1 << (h & 0x1f); ETHER_NEXT_MULTI(step, enm); } while (enm != NULL); + ETHER_UNLOCK(ec); sc->sc_rxc |= RXC_MHTE; CSR_WRITE_4(sc, MTR0, hashes[0]); CSR_WRITE_4(sc, MTR1, hashes[1]); Index: src/sys/dev/pci/if_ale.c diff -u src/sys/dev/pci/if_ale.c:1.30 src/sys/dev/pci/if_ale.c:1.31 --- src/sys/dev/pci/if_ale.c:1.30 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_ale.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ale.c,v 1.30 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_ale.c,v 1.31 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 2008, Pyun YongHyeon <yong...@freebsd.org> @@ -32,7 +32,7 @@ /* Driver for Atheros AR8121/AR8113/AR8114 PCIe Ethernet. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ale.c,v 1.30 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ale.c,v 1.31 2019/05/28 07:41:49 msaitoh Exp $"); #include "vlan.h" @@ -2014,6 +2014,7 @@ ale_rxfilter(struct ale_softc *sc) mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); } CSR_WRITE_4(sc, ALE_MAR0, mchash[0]); Index: src/sys/dev/pci/if_xge.c diff -u src/sys/dev/pci/if_xge.c:1.30 src/sys/dev/pci/if_xge.c:1.31 --- src/sys/dev/pci/if_xge.c:1.30 Thu May 23 10:57:28 2019 +++ src/sys/dev/pci/if_xge.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_xge.c,v 1.30 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: if_xge.c,v 1.31 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2004, SUNET, Swedish University Computer Network. @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_xge.c,v 1.30 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_xge.c,v 1.31 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> @@ -887,14 +887,18 @@ xge_mcast_filter(struct xge_softc *sc) int i, numaddr = 1; /* first slot used for card unicast address */ uint64_t val; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { /* Skip ranges */ + ETHER_UNLOCK(ec); goto allmulti; } - if (numaddr == MAX_MCAST_ADDR) + if (numaddr == MAX_MCAST_ADDR) { + ETHER_UNLOCK(ec); goto allmulti; + } for (val = 0, i = 0; i < ETHER_ADDR_LEN; i++) { val <<= 8; val |= enm->enm_addrlo[i]; @@ -908,6 +912,7 @@ xge_mcast_filter(struct xge_softc *sc) numaddr++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* set the remaining entries to the broadcast address */ for (i = numaddr; i < MAX_MCAST_ADDR; i++) { PIF_WCSR(RMAC_ADDR_DATA0_MEM, 0xffffffffffff0000ULL); Index: src/sys/dev/pci/if_bge.c diff -u src/sys/dev/pci/if_bge.c:1.332 src/sys/dev/pci/if_bge.c:1.333 --- src/sys/dev/pci/if_bge.c:1.332 Fri May 24 05:57:35 2019 +++ src/sys/dev/pci/if_bge.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bge.c,v 1.332 2019/05/24 05:57:35 msaitoh Exp $ */ +/* $NetBSD: if_bge.c,v 1.333 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2001 Wind River Systems @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.332 2019/05/24 05:57:35 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.333 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1806,6 +1806,7 @@ bge_setmulti(struct bge_softc *sc) goto allmulti; /* Now program new ones. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1817,6 +1818,7 @@ bge_setmulti(struct bge_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1828,6 +1830,7 @@ bge_setmulti(struct bge_softc *sc) hashes[(h & 0x60) >> 5] |= 1 << (h & 0x1F); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto setit; Index: src/sys/dev/pci/if_bnx.c diff -u src/sys/dev/pci/if_bnx.c:1.84 src/sys/dev/pci/if_bnx.c:1.85 --- src/sys/dev/pci/if_bnx.c:1.84 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_bnx.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bnx.c,v 1.84 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_bnx.c,v 1.85 2019/05/28 07:41:49 msaitoh Exp $ */ /* $OpenBSD: if_bnx.c,v 1.101 2013/03/28 17:21:44 brad Exp $ */ /*- @@ -35,7 +35,7 @@ #if 0 __FBSDID("$FreeBSD: src/sys/dev/bce/if_bce.c,v 1.3 2006/04/13 14:12:26 ru Exp $"); #endif -__KERNEL_RCSID(0, "$NetBSD: if_bnx.c,v 1.84 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bnx.c,v 1.85 2019/05/28 07:41:49 msaitoh Exp $"); /* * The following controllers are supported by this driver: @@ -5620,10 +5620,12 @@ allmulti: /* Accept one or more multicast(s). */ DBPRINT(sc, BNX_INFO, "Enabling selective multicast mode.\n"); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { + ETHER_UNLOCK(ec); goto allmulti; } h = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN) & @@ -5631,6 +5633,7 @@ allmulti: hashes[(h & 0xE0) >> 5] |= 1 << (h & 0x1F); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) REG_WR(sc, BNX_EMAC_MULTICAST_HASH0 + (i * 4), Index: src/sys/dev/pci/if_cas.c diff -u src/sys/dev/pci/if_cas.c:1.34 src/sys/dev/pci/if_cas.c:1.35 --- src/sys/dev/pci/if_cas.c:1.34 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_cas.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_cas.c,v 1.34 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_cas.c,v 1.35 2019/05/28 07:41:49 msaitoh Exp $ */ /* $OpenBSD: if_cas.c,v 1.29 2009/11/29 16:19:38 kettenis Exp $ */ /* @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_cas.c,v 1.34 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_cas.c,v 1.35 2019/05/28 07:41:49 msaitoh Exp $"); #ifndef _MODULE #include "opt_inet.h" @@ -1927,6 +1927,7 @@ cas_iff(struct cas_softc *sc) for (i = 0; i < 16; i++) hash[i] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { crc = ether_crc32_le(enm->enm_addrlo, @@ -1940,6 +1941,7 @@ cas_iff(struct cas_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* Now load the hash table into the chip (if we are using it) */ for (i = 0; i < 16; i++) { Index: src/sys/dev/pci/if_de.c diff -u src/sys/dev/pci/if_de.c:1.161 src/sys/dev/pci/if_de.c:1.162 --- src/sys/dev/pci/if_de.c:1.161 Thu May 23 10:57:28 2019 +++ src/sys/dev/pci/if_de.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_de.c,v 1.161 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: if_de.c,v 1.162 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 1994-1997 Matt Thomas (m...@3am-software.com) @@ -37,7 +37,7 @@ * board which support 21040, 21041, or 21140 (mostly). */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.161 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.162 2019/05/28 07:41:49 msaitoh Exp $"); #define TULIP_HDR_DATA @@ -3205,6 +3205,7 @@ tulip_ifmedia_status(struct ifnet * cons static void tulip_addr_filter(tulip_softc_t * const sc) { + struct ethercom *ec = TULIP_ETHERCOM(sc); struct ether_multistep step; struct ether_multi *enm; @@ -3237,7 +3238,8 @@ tulip_addr_filter(tulip_softc_t * const * hardware). */ memset(sc->tulip_setupdata, 0, sizeof(sc->tulip_setupdata)); - ETHER_FIRST_MULTI(step, TULIP_ETHERCOM(sc), enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) == 0) { hash = tulip_mchash(enm->enm_addrlo); @@ -3254,6 +3256,7 @@ tulip_addr_filter(tulip_softc_t * const } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* * No reason to use a hash if we are going to be * receiving every multicast. @@ -3293,7 +3296,8 @@ tulip_addr_filter(tulip_softc_t * const /* * Else can get perfect filtering for 16 addresses. */ - ETHER_FIRST_MULTI(step, TULIP_ETHERCOM(sc), enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); for (; enm != NULL; idx++) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) == 0) { #if BYTE_ORDER == BIG_ENDIAN @@ -3311,6 +3315,7 @@ tulip_addr_filter(tulip_softc_t * const } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* * Add the broadcast address. */ Index: src/sys/dev/pci/if_dge.c diff -u src/sys/dev/pci/if_dge.c:1.53 src/sys/dev/pci/if_dge.c:1.54 --- src/sys/dev/pci/if_dge.c:1.53 Thu May 23 10:57:28 2019 +++ src/sys/dev/pci/if_dge.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_dge.c,v 1.53 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: if_dge.c,v 1.54 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2004, SUNET, Swedish University Computer Network. @@ -80,7 +80,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.53 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.54 2019/05/28 07:41:49 msaitoh Exp $"); @@ -2267,6 +2267,7 @@ dge_set_filter(struct dge_softc *sc) for (i = 0; i < MC_TABSIZE; i++) CSR_WRITE(sc, DGE_MTA + (i << 2), 0); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -2278,6 +2279,7 @@ dge_set_filter(struct dge_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -2293,6 +2295,7 @@ dge_set_filter(struct dge_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto setit; Index: src/sys/dev/pci/if_et.c diff -u src/sys/dev/pci/if_et.c:1.23 src/sys/dev/pci/if_et.c:1.24 --- src/sys/dev/pci/if_et.c:1.23 Thu May 23 10:51:39 2019 +++ src/sys/dev/pci/if_et.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_et.c,v 1.23 2019/05/23 10:51:39 msaitoh Exp $ */ +/* $NetBSD: if_et.c,v 1.24 2019/05/28 07:41:49 msaitoh Exp $ */ /* $OpenBSD: if_et.c,v 1.11 2008/06/08 06:18:07 jsg Exp $ */ /* * Copyright (c) 2007 The DragonFly Project. All rights reserved. @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_et.c,v 1.23 2019/05/23 10:51:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_et.c,v 1.24 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" #include "vlan.h" @@ -1218,6 +1218,7 @@ et_setmulti(struct et_softc *sc) bcopy(etherbroadcastaddr, addr, ETHER_ADDR_LEN); count = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { uint32_t *hp, h; @@ -1245,6 +1246,7 @@ et_setmulti(struct et_softc *sc) ++count; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); for (i = 0; i < 4; ++i) CSR_WRITE_4(sc, ET_MULTI_HASH + (i * 4), hash[i]); Index: src/sys/dev/pci/if_jme.c diff -u src/sys/dev/pci/if_jme.c:1.42 src/sys/dev/pci/if_jme.c:1.43 --- src/sys/dev/pci/if_jme.c:1.42 Tue May 28 05:07:13 2019 +++ src/sys/dev/pci/if_jme.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_jme.c,v 1.42 2019/05/28 05:07:13 msaitoh Exp $ */ +/* $NetBSD: if_jme.c,v 1.43 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2008 Manuel Bouyer. All rights reserved. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1.42 2019/05/28 05:07:13 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1.43 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> @@ -1842,6 +1842,7 @@ jme_mac_config(jme_softc_t *sc) static void jme_set_filter(jme_softc_t *sc) { + struct ethercom *ec = &sc->jme_ec; struct ifnet *ifp = &sc->jme_if; struct ether_multistep step; struct ether_multi *enm; @@ -1879,7 +1880,8 @@ jme_set_filter(jme_softc_t *sc) rxcfg |= RXMAC_MULTICAST; memset(hash, 0, sizeof(hash)); - ETHER_FIRST_MULTI(step, &sc->jme_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { #ifdef JEMDBUG printf("%s: addrs %s %s\n", __func__, @@ -1898,6 +1900,7 @@ jme_set_filter(jme_softc_t *sc) } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); #ifdef JMEDEBUG printf("%s: hash1 %x has2 %x\n", __func__, hash[0], hash[1]); #endif Index: src/sys/dev/pci/if_lii.c diff -u src/sys/dev/pci/if_lii.c:1.24 src/sys/dev/pci/if_lii.c:1.25 --- src/sys/dev/pci/if_lii.c:1.24 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_lii.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_lii.c,v 1.24 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_lii.c,v 1.25 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2008 The NetBSD Foundation. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_lii.c,v 1.24 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_lii.c,v 1.25 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> @@ -1174,11 +1174,13 @@ lii_setmulti(struct lii_softc *sc) ifp->if_flags &= ~IFF_ALLMULTI; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { ifp->if_flags |= IFF_ALLMULTI; mht0 = mht1 = 0; + ETHER_UNLOCK(ec); goto alldone; } @@ -1191,6 +1193,7 @@ lii_setmulti(struct lii_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); alldone: AT_WRITE_4(sc, ATL2_MHT, mht0); Index: src/sys/dev/pci/if_msk.c diff -u src/sys/dev/pci/if_msk.c:1.89 src/sys/dev/pci/if_msk.c:1.90 --- src/sys/dev/pci/if_msk.c:1.89 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_msk.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_msk.c,v 1.89 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_msk.c,v 1.90 2019/05/28 07:41:49 msaitoh Exp $ */ /* $OpenBSD: if_msk.c,v 1.79 2009/10/15 17:54:56 deraadt Exp $ */ /* @@ -52,7 +52,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.89 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.90 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -371,11 +371,13 @@ allmulti: } } else { /* First find the tail of the list. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto allmulti; } h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) & @@ -387,6 +389,7 @@ allmulti: ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); reg |= YU_RCR_MUFLEN; } Index: src/sys/dev/pci/if_nfe.c diff -u src/sys/dev/pci/if_nfe.c:1.69 src/sys/dev/pci/if_nfe.c:1.70 --- src/sys/dev/pci/if_nfe.c:1.69 Thu May 23 10:51:39 2019 +++ src/sys/dev/pci/if_nfe.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_nfe.c,v 1.69 2019/05/23 10:51:39 msaitoh Exp $ */ +/* $NetBSD: if_nfe.c,v 1.70 2019/05/28 07:41:49 msaitoh Exp $ */ /* $OpenBSD: if_nfe.c,v 1.77 2008/02/05 16:52:50 brad Exp $ */ /*- @@ -21,7 +21,7 @@ /* Driver for NVIDIA nForce MCP Fast Ethernet and Gigabit Ethernet */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.69 2019/05/23 10:51:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.70 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" #include "vlan.h" @@ -1897,12 +1897,14 @@ nfe_setmulti(struct nfe_softc *sc) memcpy(addr, etherbroadcastaddr, ETHER_ADDR_LEN); memcpy(mask, etherbroadcastaddr, ETHER_ADDR_LEN); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { ifp->if_flags |= IFF_ALLMULTI; memset(addr, 0, ETHER_ADDR_LEN); memset(mask, 0, ETHER_ADDR_LEN); + ETHER_UNLOCK(ec); goto done; } for (i = 0; i < ETHER_ADDR_LEN; i++) { @@ -1911,6 +1913,7 @@ nfe_setmulti(struct nfe_softc *sc) } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); for (i = 0; i < ETHER_ADDR_LEN; i++) mask[i] |= addr[i]; Index: src/sys/dev/pci/if_pcn.c diff -u src/sys/dev/pci/if_pcn.c:1.70 src/sys/dev/pci/if_pcn.c:1.71 --- src/sys/dev/pci/if_pcn.c:1.70 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_pcn.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_pcn.c,v 1.70 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_pcn.c,v 1.71 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_pcn.c,v 1.70 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_pcn.c,v 1.71 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1959,6 +1959,7 @@ pcn_set_filter(struct pcn_softc *sc) sc->sc_initblock.init_ladrf[2] = sc->sc_initblock.init_ladrf[3] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1970,6 +1971,7 @@ pcn_set_filter(struct pcn_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1984,6 +1986,7 @@ pcn_set_filter(struct pcn_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; return; Index: src/sys/dev/pci/if_sip.c diff -u src/sys/dev/pci/if_sip.c:1.172 src/sys/dev/pci/if_sip.c:1.173 --- src/sys/dev/pci/if_sip.c:1.172 Thu May 23 10:51:39 2019 +++ src/sys/dev/pci/if_sip.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_sip.c,v 1.172 2019/05/23 10:51:39 msaitoh Exp $ */ +/* $NetBSD: if_sip.c,v 1.173 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1.172 2019/05/23 10:51:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1.173 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -3041,6 +3041,7 @@ sipcom_sis900_set_filter(struct sip_soft /* Set the corresponding bit in the hash table. */ mchash[crc >> 4] |= 1 << (crc & 0xf); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -3052,6 +3053,7 @@ sipcom_sis900_set_filter(struct sip_soft * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -3072,6 +3074,7 @@ sipcom_sis900_set_filter(struct sip_soft ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; goto setit; Index: src/sys/dev/pci/if_sk.c diff -u src/sys/dev/pci/if_sk.c:1.96 src/sys/dev/pci/if_sk.c:1.97 --- src/sys/dev/pci/if_sk.c:1.96 Thu May 23 10:57:28 2019 +++ src/sys/dev/pci/if_sk.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_sk.c,v 1.96 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: if_sk.c,v 1.97 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -115,7 +115,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.96 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.97 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -633,11 +633,13 @@ allmulti: } else { i = 1; /* First find the tail of the list. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto allmulti; } DPRINTFN(2,("multicast address %s\n", @@ -670,6 +672,7 @@ allmulti: ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); } switch (sc->sk_type) { Index: src/sys/dev/pci/if_ste.c diff -u src/sys/dev/pci/if_ste.c:1.55 src/sys/dev/pci/if_ste.c:1.56 --- src/sys/dev/pci/if_ste.c:1.55 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_ste.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ste.c,v 1.55 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_ste.c,v 1.56 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ste.c,v 1.55 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ste.c,v 1.56 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> @@ -1537,9 +1537,12 @@ ste_set_filter(struct ste_softc *sc) memset(mchash, 0, sizeof(mchash)); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); - if (enm == NULL) + if (enm == NULL) { + ETHER_UNLOCK(ec); goto done; + } while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1551,6 +1554,7 @@ ste_set_filter(struct ste_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1564,6 +1568,7 @@ ste_set_filter(struct ste_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); sc->sc_ReceiveMode |= RM_ReceiveMulticastHash; Index: src/sys/dev/pci/if_txp.c diff -u src/sys/dev/pci/if_txp.c:1.55 src/sys/dev/pci/if_txp.c:1.56 --- src/sys/dev/pci/if_txp.c:1.55 Thu May 23 10:30:36 2019 +++ src/sys/dev/pci/if_txp.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_txp.c,v 1.55 2019/05/23 10:30:36 msaitoh Exp $ */ +/* $NetBSD: if_txp.c,v 1.56 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2001 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.55 2019/05/23 10:30:36 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.56 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" @@ -1952,6 +1952,7 @@ again: else { hash[0] = hash[1] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, @@ -1967,6 +1968,7 @@ again: * all bits set.) */ ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto again; } @@ -1989,6 +1991,7 @@ again: hash[hashbit / 32] |= (1 << hashbit % 32); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); if (mcnt > 0) { filter |= TXP_RXFILT_HASHMULTI; Index: src/sys/dev/pci/if_stge.c diff -u src/sys/dev/pci/if_stge.c:1.68 src/sys/dev/pci/if_stge.c:1.69 --- src/sys/dev/pci/if_stge.c:1.68 Thu May 23 10:51:39 2019 +++ src/sys/dev/pci/if_stge.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_stge.c,v 1.68 2019/05/23 10:51:39 msaitoh Exp $ */ +/* $NetBSD: if_stge.c,v 1.69 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_stge.c,v 1.68 2019/05/23 10:51:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_stge.c,v 1.69 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> @@ -1882,9 +1882,12 @@ stge_set_filter(struct stge_softc *sc) memset(mchash, 0, sizeof(mchash)); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); - if (enm == NULL) + if (enm == NULL) { + ETHER_UNLOCK(ec); goto done; + } while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1896,6 +1899,7 @@ stge_set_filter(struct stge_softc *sc) * ranges is for IP multicast routing, for which the * range is big enough to require all bits set.) */ + ETHER_UNLOCK(ec); goto allmulti; } @@ -1909,6 +1913,7 @@ stge_set_filter(struct stge_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); sc->sc_ReceiveMode |= RM_ReceiveMulticastHash; Index: src/sys/dev/pci/if_ti.c diff -u src/sys/dev/pci/if_ti.c:1.109 src/sys/dev/pci/if_ti.c:1.110 --- src/sys/dev/pci/if_ti.c:1.109 Thu May 23 10:40:39 2019 +++ src/sys/dev/pci/if_ti.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ti.c,v 1.109 2019/05/23 10:40:39 msaitoh Exp $ */ +/* $NetBSD: if_ti.c,v 1.110 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -81,7 +81,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.109 2019/05/23 10:40:39 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.110 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" @@ -1168,18 +1168,24 @@ ti_setmulti(struct ti_softc *sc) * Remember all multicast addresses so that we can delete them * later. Punt if there is a range of addresses or memory shortage. */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } if ((mc = malloc(sizeof(struct ti_mc_entry), M_DEVBUF, - M_NOWAIT)) == NULL) + M_NOWAIT)) == NULL) { + ETHER_UNLOCK(ec); goto allmulti; + } memcpy(&mc->mc_addr, enm->enm_addrlo, ETHER_ADDR_LEN); SIMPLEQ_INSERT_HEAD(&sc->ti_mc_listhead, mc, mc_entries); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* Accept only programmed multicast addresses */ ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/pci/if_tl.c diff -u src/sys/dev/pci/if_tl.c:1.115 src/sys/dev/pci/if_tl.c:1.116 --- src/sys/dev/pci/if_tl.c:1.115 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_tl.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_tl.c,v 1.115 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_tl.c,v 1.116 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. All rights reserved. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_tl.c,v 1.115 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_tl.c,v 1.116 2019/05/28 07:41:49 msaitoh Exp $"); #undef TLDEBUG #define TL_PRIV_STATS @@ -1573,13 +1573,15 @@ tl_read_stats(tl_softc_t *sc) static void tl_addr_filter(tl_softc_t *sc) { + struct ethercom *ec = &sc->tl_ec; struct ether_multistep step; struct ether_multi *enm; uint32_t hash[2] = {0, 0}; int i; sc->tl_if.if_flags &= ~IFF_ALLMULTI; - ETHER_FIRST_MULTI(step, &sc->tl_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { #ifdef TLDEBUG printf("%s: addrs %s %s\n", __func__, @@ -1596,6 +1598,7 @@ tl_addr_filter(tl_softc_t *sc) } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); #ifdef TLDEBUG printf("%s: hash1 %x has2 %x\n", __func__, hash[0], hash[1]); #endif Index: src/sys/dev/pci/if_vge.c diff -u src/sys/dev/pci/if_vge.c:1.71 src/sys/dev/pci/if_vge.c:1.72 --- src/sys/dev/pci/if_vge.c:1.71 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_vge.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vge.c,v 1.71 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_vge.c,v 1.72 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 2004 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.71 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.72 2019/05/28 07:41:49 msaitoh Exp $"); /* * VIA Networking Technologies VT612x PCI gigabit ethernet NIC driver. @@ -661,14 +661,17 @@ vge_setmulti(struct vge_softc *sc) } /* Now program new ones */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { /* * If multicast range, fall back to ALLMULTI. */ if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } error = vge_cam_set(sc, enm->enm_addrlo); if (error) @@ -676,19 +679,23 @@ vge_setmulti(struct vge_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* If there were too many addresses, use the hash filter. */ if (error) { vge_cam_clear(sc); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { /* * If multicast range, fall back to ALLMULTI. */ if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26; @@ -696,6 +703,7 @@ vge_setmulti(struct vge_softc *sc) ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); CSR_WRITE_4(sc, VGE_MAR0, hashes[0]); CSR_WRITE_4(sc, VGE_MAR1, hashes[1]); Index: src/sys/dev/pci/if_vr.c diff -u src/sys/dev/pci/if_vr.c:1.129 src/sys/dev/pci/if_vr.c:1.130 --- src/sys/dev/pci/if_vr.c:1.129 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_vr.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vr.c,v 1.129 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_vr.c,v 1.130 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc. @@ -97,7 +97,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vr.c,v 1.129 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vr.c,v 1.130 2019/05/28 07:41:49 msaitoh Exp $"); @@ -478,11 +478,14 @@ allmulti: CSR_WRITE_4(sc, VR_MAR1, 0); /* now program new ones */ + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } h = vr_calchash(enm->enm_addrlo); @@ -493,6 +496,7 @@ allmulti: ETHER_NEXT_MULTI(step, enm); mcnt++; } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/pci/if_vte.c diff -u src/sys/dev/pci/if_vte.c:1.25 src/sys/dev/pci/if_vte.c:1.26 --- src/sys/dev/pci/if_vte.c:1.25 Thu May 23 13:10:52 2019 +++ src/sys/dev/pci/if_vte.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vte.c,v 1.25 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_vte.c,v 1.26 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2011 Manuel Bouyer. All rights reserved. @@ -55,7 +55,7 @@ /* Driver for DM&P Electronics, Inc, Vortex86 RDC R6040 FastEthernet. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vte.c,v 1.25 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vte.c,v 1.26 2019/05/28 07:41:49 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1565,6 +1565,7 @@ vte_init_rx_ring(struct vte_softc *sc) static void vte_rxfilter(struct vte_softc *sc) { + struct ethercom *ec = &sc->vte_ec; struct ether_multistep step; struct ether_multi *enm; struct ifnet *ifp; @@ -1601,7 +1602,8 @@ vte_rxfilter(struct vte_softc *sc) goto chipit; } - ETHER_FIRST_MULTI(step, &sc->vte_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); nperf = 0; while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN) @@ -1612,6 +1614,7 @@ vte_rxfilter(struct vte_softc *sc) mchash[1] = 0xFFFF; mchash[2] = 0xFFFF; mchash[3] = 0xFFFF; + ETHER_UNLOCK(ec); goto chipit; } /* @@ -1631,6 +1634,7 @@ vte_rxfilter(struct vte_softc *sc) } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); if (mchash[0] != 0 || mchash[1] != 0 || mchash[2] != 0 || mchash[3] != 0) mcr |= MCR0_MULTICAST; Index: src/sys/dev/pcmcia/if_ray.c diff -u src/sys/dev/pcmcia/if_ray.c:1.93 src/sys/dev/pcmcia/if_ray.c:1.94 --- src/sys/dev/pcmcia/if_ray.c:1.93 Thu May 23 10:57:28 2019 +++ src/sys/dev/pcmcia/if_ray.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ray.c,v 1.93 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: if_ray.c,v 1.94 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 2000 Christian E. Hopps @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ray.c,v 1.93 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ray.c,v 1.94 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" @@ -2827,6 +2827,7 @@ ray_update_mcast(struct ray_softc *sc) /* see if we have any ranges */ if ((count = sc->sc_ec.ec_multicnt) < 17) { + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm) { /* see if this is a range */ @@ -2837,6 +2838,7 @@ ray_update_mcast(struct ray_softc *sc) } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); } /* track this stuff even when not running */ @@ -2858,12 +2860,14 @@ ray_update_mcast(struct ray_softc *sc) return; SRAM_WRITE_FIELD_1(sc, ccs, ray_cmd_update_mcast, c_nmcast, count); bufp = RAY_HOST_TO_ECF_BASE; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm) { ray_write_region(sc, bufp, enm->enm_addrlo, ETHER_ADDR_LEN); bufp += ETHER_ADDR_LEN; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); (void)ray_issue_cmd(sc, ccs, SCP_UPD_MCAST); } Index: src/sys/dev/pcmcia/if_xi.c diff -u src/sys/dev/pcmcia/if_xi.c:1.89 src/sys/dev/pcmcia/if_xi.c:1.90 --- src/sys/dev/pcmcia/if_xi.c:1.89 Thu May 23 13:10:52 2019 +++ src/sys/dev/pcmcia/if_xi.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_xi.c,v 1.89 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_xi.c,v 1.90 2019/05/28 07:41:49 msaitoh Exp $ */ /* OpenBSD: if_xe.c,v 1.9 1999/09/16 11:28:42 niklas Exp */ /* @@ -55,7 +55,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_xi.c,v 1.89 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_xi.c,v 1.90 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" @@ -944,7 +944,7 @@ xi_set_address(struct xi_softc *sc) { bus_space_tag_t bst = sc->sc_bst; bus_space_handle_t bsh = sc->sc_bsh; - struct ethercom *ether = &sc->sc_ethercom; + struct ethercom *ec = &sc->sc_ethercom; struct ifnet *ifp = &sc->sc_ethercom.ec_if; struct ether_multistep step; struct ether_multi *enm; @@ -965,12 +965,13 @@ xi_set_address(struct xi_softc *sc) indaddr[i] = enaddr[i]; num = 1; - if (ether->ec_multicnt > 9) { + if (ec->ec_multicnt > 9) { ifp->if_flags |= IFF_ALLMULTI; goto done; } - ETHER_FIRST_MULTI(step, ether, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); for (; enm; num++) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, sizeof(enm->enm_addrlo)) != 0) { @@ -980,6 +981,7 @@ xi_set_address(struct xi_softc *sc) * XXX should we be setting IFF_ALLMULTI here? */ ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto done; } if (sc->sc_chipset >= XI_CHIPSET_MOHAWK) @@ -990,6 +992,7 @@ xi_set_address(struct xi_softc *sc) indaddr[num * 6 + i] = enm->enm_addrlo[i]; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; done: Index: src/sys/dev/qbus/if_il.c diff -u src/sys/dev/qbus/if_il.c:1.34 src/sys/dev/qbus/if_il.c:1.35 --- src/sys/dev/qbus/if_il.c:1.34 Fri May 24 08:29:17 2019 +++ src/sys/dev/qbus/if_il.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_il.c,v 1.34 2019/05/24 08:29:17 msaitoh Exp $ */ +/* $NetBSD: if_il.c,v 1.35 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 1982, 1986 Regents of the University of California. * All rights reserved. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_il.c,v 1.34 2019/05/24 08:29:17 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_il.c,v 1.35 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" @@ -335,6 +335,7 @@ too_many_multis: goto out; } else { int i; + struct ethercom *ec = &sc->sc_ec; register struct ether_addr *ep = sc->sc_maddrs; struct ether_multi *enm; struct ether_multistep step; @@ -345,7 +346,8 @@ too_many_multis: * multicasts. */ i = 0; - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (++i > 63 /* && k != 0 */) { break; @@ -353,6 +355,7 @@ too_many_multis: *ep++ = *(struct ether_addr *)enm->enm_addrlo; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); if (i == 0) { /* no multicasts! */ } else if (i <= 63) { Index: src/sys/dev/qbus/if_qe.c diff -u src/sys/dev/qbus/if_qe.c:1.80 src/sys/dev/qbus/if_qe.c:1.81 --- src/sys/dev/qbus/if_qe.c:1.80 Thu May 23 10:57:28 2019 +++ src/sys/dev/qbus/if_qe.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_qe.c,v 1.80 2019/05/23 10:57:28 msaitoh Exp $ */ +/* $NetBSD: if_qe.c,v 1.81 2019/05/28 07:41:49 msaitoh Exp $ */ /* * Copyright (c) 1999 Ludd, University of Lule}, Sweden. All rights reserved. * @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_qe.c,v 1.80 2019/05/23 10:57:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_qe.c,v 1.81 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_inet.h" @@ -769,6 +769,7 @@ qe_add_rxbuf(struct qe_softc *sc, int i) void qe_setup(struct qe_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ether_multi *enm; struct ether_multistep step; struct qe_cdata *qc = sc->sc_qedata; @@ -797,7 +798,8 @@ qe_setup(struct qe_softc *sc) */ j = 3; k = 0; ifp->if_flags &= ~IFF_ALLMULTI; - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6)) { ifp->if_flags |= IFF_ALLMULTI; @@ -815,6 +817,7 @@ qe_setup(struct qe_softc *sc) } ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); idx = sc->sc_nexttx; qc->qc_xmit[idx].qe_buf_len = -64; Index: src/sys/dev/sbus/be.c diff -u src/sys/dev/sbus/be.c:1.92 src/sys/dev/sbus/be.c:1.93 --- src/sys/dev/sbus/be.c:1.92 Fri Apr 26 06:33:34 2019 +++ src/sys/dev/sbus/be.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: be.c,v 1.92 2019/04/26 06:33:34 msaitoh Exp $ */ +/* $NetBSD: be.c,v 1.93 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: be.c,v 1.92 2019/04/26 06:33:34 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: be.c,v 1.93 2019/05/28 07:41:49 msaitoh Exp $"); #include "opt_ddb.h" #include "opt_inet.h" @@ -1148,6 +1148,7 @@ be_mcreset(struct be_softc *sc) hash[3] = hash[2] = hash[1] = hash[0] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { @@ -1163,6 +1164,7 @@ be_mcreset(struct be_softc *sc) */ hash[3] = hash[2] = hash[1] = hash[0] = 0xffff; ifp->if_flags |= IFF_ALLMULTI; + ETHER_UNLOCK(ec); goto chipit; } @@ -1173,6 +1175,7 @@ be_mcreset(struct be_softc *sc) hash[crc >> 4] |= 1 << (crc & 0xf); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/sbus/qe.c diff -u src/sys/dev/sbus/qe.c:1.73 src/sys/dev/sbus/qe.c:1.74 --- src/sys/dev/sbus/qe.c:1.73 Thu May 23 13:10:52 2019 +++ src/sys/dev/sbus/qe.c Tue May 28 07:41:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: qe.c,v 1.73 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: qe.c,v 1.74 2019/05/28 07:41:49 msaitoh Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: qe.c,v 1.73 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: qe.c,v 1.74 2019/05/28 07:41:49 msaitoh Exp $"); #define QEDEBUG @@ -1092,6 +1092,7 @@ qe_mcreset(struct qe_softc *sc) hash[3] = hash[2] = hash[1] = hash[0] = 0; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, @@ -1119,6 +1120,7 @@ qe_mcreset(struct qe_softc *sc) hash[crc >> 4] |= 1 << (crc & 0xf); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* We need to byte-swap the hash before writing to the chip. */ for (i = 0; i < 7; i += 2) { Index: src/sys/dev/scsipi/if_se.c diff -u src/sys/dev/scsipi/if_se.c:1.101 src/sys/dev/scsipi/if_se.c:1.102 --- src/sys/dev/scsipi/if_se.c:1.101 Thu May 23 13:10:52 2019 +++ src/sys/dev/scsipi/if_se.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_se.c,v 1.101 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_se.c,v 1.102 2019/05/28 07:41:50 msaitoh Exp $ */ /* * Copyright (c) 1997 Ian W. Dall <ian.d...@dsto.defence.gov.au> @@ -59,7 +59,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_se.c,v 1.101 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_se.c,v 1.102 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -888,6 +888,7 @@ sc_set_all_multi(struct se_softc *sc, in struct ether_multi *enm; struct ether_multistep step; + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (ETHER_CMP(enm->enm_addrlo, enm->enm_addrhi)) { @@ -904,6 +905,7 @@ sc_set_all_multi(struct se_softc *sc, in * typically not possible. The only real alternative * is to go into promicuous mode and filter by hand. */ + ETHER_UNLOCK(ec); return (ENODEV); } @@ -914,6 +916,8 @@ sc_set_all_multi(struct se_softc *sc, in return (error); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); + return (error); } #endif /* not used */ Index: src/sys/dev/usb/if_aue.c diff -u src/sys/dev/usb/if_aue.c:1.153 src/sys/dev/usb/if_aue.c:1.154 --- src/sys/dev/usb/if_aue.c:1.153 Thu May 23 13:10:52 2019 +++ src/sys/dev/usb/if_aue.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_aue.c,v 1.153 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_aue.c,v 1.154 2019/05/28 07:41:50 msaitoh Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.153 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.154 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -582,6 +582,7 @@ aue_crc(void *addrv) Static void aue_setmulti(struct aue_softc *sc) { + struct ethercom *ec = &sc->aue_ec; struct ifnet *ifp; struct ether_multi *enm; struct ether_multistep step; @@ -605,16 +606,20 @@ allmulti: aue_csr_write_1(sc, AUE_MAR0 + i, 0); /* now program new ones */ - ETHER_FIRST_MULTI(step, &sc->aue_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, - enm->enm_addrhi, ETHER_ADDR_LEN) != 0) + enm->enm_addrhi, ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } h = aue_crc(enm->enm_addrlo); AUE_SETBIT(sc, AUE_MAR + (h >> 3), 1 << (h & 0x7)); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; } Index: src/sys/dev/usb/if_axe.c diff -u src/sys/dev/usb/if_axe.c:1.97 src/sys/dev/usb/if_axe.c:1.98 --- src/sys/dev/usb/if_axe.c:1.97 Thu May 23 13:10:52 2019 +++ src/sys/dev/usb/if_axe.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axe.c,v 1.97 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_axe.c,v 1.98 2019/05/28 07:41:50 msaitoh Exp $ */ /* $OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */ /* @@ -87,7 +87,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.97 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.98 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -471,6 +471,7 @@ static void axe_setmulti(struct axe_softc *sc) { AXEHIST_FUNC(); AXEHIST_CALLED(); + struct ethercom *ec = &sc->axe_ec; struct ifnet *ifp = &sc->sc_if; struct ether_multi *enm; struct ether_multistep step; @@ -503,16 +504,20 @@ axe_setmulti(struct axe_softc *sc) } /* Now program new ones */ - ETHER_FIRST_MULTI(step, &sc->axe_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26; hashtbl[h >> 3] |= 1U << (h & 7); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; rxmode |= AXE_RXCMD_MULTICAST; Index: src/sys/dev/usb/if_axen.c diff -u src/sys/dev/usb/if_axen.c:1.40 src/sys/dev/usb/if_axen.c:1.41 --- src/sys/dev/usb/if_axen.c:1.40 Thu May 23 13:10:52 2019 +++ src/sys/dev/usb/if_axen.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axen.c,v 1.40 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_axen.c,v 1.41 2019/05/28 07:41:50 msaitoh Exp $ */ /* $OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $ */ /* @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.40 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.41 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -370,6 +370,7 @@ allmulti: ifp->if_flags |= IFF_ALLMULTI; /* now program new ones */ DPRINTF(("%s: initializing hash table\n", device_xname(sc->axen_dev))); + ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, @@ -377,6 +378,7 @@ allmulti: ifp->if_flags |= IFF_ALLMULTI; DPRINTF(("%s: allmulti\n", device_xname(sc->axen_dev))); memset(hashtbl, 0, sizeof(hashtbl)); + ETHER_UNLOCK(ec); goto allmulti; } h = ether_crc32_be(enm->enm_addrlo, @@ -387,6 +389,7 @@ allmulti: ifp->if_flags |= IFF_ALLMULTI; ether_sprintf(enm->enm_addrlo))); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); rxmode |= AXEN_RXCTL_ACPT_MCAST; } Index: src/sys/dev/usb/if_cue.c diff -u src/sys/dev/usb/if_cue.c:1.83 src/sys/dev/usb/if_cue.c:1.84 --- src/sys/dev/usb/if_cue.c:1.83 Thu May 23 13:10:52 2019 +++ src/sys/dev/usb/if_cue.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_cue.c,v 1.83 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_cue.c,v 1.84 2019/05/28 07:41:50 msaitoh Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 * Bill Paul <wp...@ee.columbia.edu>. All rights reserved. @@ -56,7 +56,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.83 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.84 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -356,6 +356,7 @@ cue_crc(const char *addr) Static void cue_setmulti(struct cue_softc *sc) { + struct ethercom *ec = &sc->cue_ec; struct ifnet *ifp; struct ether_multi *enm; struct ether_multistep step; @@ -381,16 +382,20 @@ allmulti: sc->cue_mctab[i] = 0; /* now program new ones */ - ETHER_FIRST_MULTI(step, &sc->cue_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, - enm->enm_addrhi, ETHER_ADDR_LEN) != 0) + enm->enm_addrhi, ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } h = cue_crc(enm->enm_addrlo); sc->cue_mctab[h >> 3] |= 1 << (h & 0x7); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/usb/if_kue.c diff -u src/sys/dev/usb/if_kue.c:1.95 src/sys/dev/usb/if_kue.c:1.96 --- src/sys/dev/usb/if_kue.c:1.95 Thu May 23 13:10:52 2019 +++ src/sys/dev/usb/if_kue.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_kue.c,v 1.95 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_kue.c,v 1.96 2019/05/28 07:41:50 msaitoh Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.95 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.96 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -315,6 +315,7 @@ kue_load_fw(struct kue_softc *sc) static void kue_setmulti(struct kue_softc *sc) { + struct ethercom *ec = &sc->kue_ec; struct ifnet *ifp = GET_IFP(sc); struct ether_multi *enm; struct ether_multistep step; @@ -334,17 +335,21 @@ allmulti: sc->kue_rxfilt &= ~KUE_RXFILT_ALLMULTI; i = 0; - ETHER_FIRST_MULTI(step, &sc->kue_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (i == KUE_MCFILTCNT(sc) || memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } memcpy(KUE_MCFILT(sc, i), enm->enm_addrlo, ETHER_ADDR_LEN); ETHER_NEXT_MULTI(step, enm); i++; } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/usb/if_mue.c diff -u src/sys/dev/usb/if_mue.c:1.47 src/sys/dev/usb/if_mue.c:1.48 --- src/sys/dev/usb/if_mue.c:1.47 Sun May 26 17:48:47 2019 +++ src/sys/dev/usb/if_mue.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mue.c,v 1.47 2019/05/26 17:48:47 mlelstv Exp $ */ +/* $NetBSD: if_mue.c,v 1.48 2019/05/28 07:41:50 msaitoh Exp $ */ /* $OpenBSD: if_mue.c,v 1.3 2018/08/04 16:42:46 jsg Exp $ */ /* @@ -20,7 +20,7 @@ /* Driver for Microchip LAN7500/LAN7800 chipsets. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.47 2019/05/26 17:48:47 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.48 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -1349,6 +1349,7 @@ mue_prepare_tso(struct mue_softc *sc, st static void mue_setmulti(struct mue_softc *sc) { + struct ethercom *ec = &sc->mue_ec; struct ifnet *ifp = GET_IFP(sc); const uint8_t *enaddr = CLLADDR(ifp->if_sadl); struct ether_multi *enm; @@ -1386,13 +1387,15 @@ allmulti: rxfilt |= MUE_RFE_CTL_MULTICAS pfiltbl[0][0] = MUE_ENADDR_HI(enaddr) | MUE_ADDR_FILTX_VALID; pfiltbl[0][1] = MUE_ENADDR_LO(enaddr); i = 1; - ETHER_FIRST_MULTI(step, &sc->mue_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { memset(pfiltbl, 0, sizeof(pfiltbl)); memset(hashtbl, 0, sizeof(hashtbl)); rxfilt &= ~MUE_RFE_CTL_MULTICAST_HASH; + ETHER_UNLOCK(ec); goto allmulti; } if (i < MUE_NUM_ADDR_FILTX) { @@ -1410,6 +1413,7 @@ allmulti: rxfilt |= MUE_RFE_CTL_MULTICAS i++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); rxfilt |= MUE_RFE_CTL_PERFECT; ifp->if_flags &= ~IFF_ALLMULTI; if (rxfilt & MUE_RFE_CTL_MULTICAST_HASH) Index: src/sys/dev/usb/if_otus.c diff -u src/sys/dev/usb/if_otus.c:1.37 src/sys/dev/usb/if_otus.c:1.38 --- src/sys/dev/usb/if_otus.c:1.37 Thu May 23 13:10:52 2019 +++ src/sys/dev/usb/if_otus.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_otus.c,v 1.37 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_otus.c,v 1.38 2019/05/28 07:41:50 msaitoh Exp $ */ /* $OpenBSD: if_otus.c,v 1.18 2010/08/27 17:08:00 jsg Exp $ */ /*- @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_otus.c,v 1.37 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_otus.c,v 1.38 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -2275,6 +2275,7 @@ otus_ioctl(struct ifnet *ifp, u_long cmd Static int otus_set_multi(struct otus_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ifnet *ifp; struct ether_multi *enm; struct ether_multistep step; @@ -2290,7 +2291,8 @@ otus_set_multi(struct otus_softc *sc) goto done; } lo = hi = 0; - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { ifp->if_flags |= IFF_ALLMULTI; @@ -2305,6 +2307,7 @@ otus_set_multi(struct otus_softc *sc) ETHER_NEXT_MULTI(step, enm); } done: + ETHER_UNLOCK(ec); mutex_enter(&sc->sc_write_mtx); hi |= 1 << 31; /* Make sure the broadcast bit is set. */ otus_write(sc, AR_MAC_REG_GROUP_HASH_TBL_L, lo); Index: src/sys/dev/usb/if_udav.c diff -u src/sys/dev/usb/if_udav.c:1.58 src/sys/dev/usb/if_udav.c:1.59 --- src/sys/dev/usb/if_udav.c:1.58 Thu May 23 10:57:29 2019 +++ src/sys/dev/usb/if_udav.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_udav.c,v 1.58 2019/05/23 10:57:29 msaitoh Exp $ */ +/* $NetBSD: if_udav.c,v 1.59 2019/05/28 07:41:50 msaitoh Exp $ */ /* $nabe: if_udav.c,v 1.3 2003/08/21 16:57:19 nabe Exp $ */ /* @@ -45,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.58 2019/05/23 10:57:29 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.59 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -783,6 +783,7 @@ udav_activate(device_t self, enum devact Static void udav_setmulti(struct udav_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ifnet *ifp; struct ether_multi *enm; struct ether_multistep step; @@ -806,7 +807,7 @@ udav_setmulti(struct udav_softc *sc) UDAV_SETBIT(sc, UDAV_RCR, UDAV_RCR_ALL | UDAV_RCR_PRMSC); return; } else if (ifp->if_flags & IFF_ALLMULTI) { - allmulti: +allmulti: ifp->if_flags |= IFF_ALLMULTI; UDAV_SETBIT(sc, UDAV_RCR, UDAV_RCR_ALL); UDAV_CLRBIT(sc, UDAV_RCR, UDAV_RCR_PRMSC); @@ -819,16 +820,20 @@ udav_setmulti(struct udav_softc *sc) udav_csr_write(sc, UDAV_MAR, hashes, sizeof(hashes)); /* now program new ones */ - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } h = UDAV_CALCHASH(enm->enm_addrlo); hashes[h>>3] |= 1 << (h & 0x7); ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); /* disable all multicast */ ifp->if_flags &= ~IFF_ALLMULTI; Index: src/sys/dev/usb/if_ure.c diff -u src/sys/dev/usb/if_ure.c:1.6 src/sys/dev/usb/if_ure.c:1.7 --- src/sys/dev/usb/if_ure.c:1.6 Thu May 23 13:10:52 2019 +++ src/sys/dev/usb/if_ure.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ure.c,v 1.6 2019/05/23 13:10:52 msaitoh Exp $ */ +/* $NetBSD: if_ure.c,v 1.7 2019/05/28 07:41:50 msaitoh Exp $ */ /* $OpenBSD: if_ure.c,v 1.10 2018/11/02 21:32:30 jcs Exp $ */ /*- * Copyright (c) 2015-2016 Kevin Lo <ke...@freebsd.org> @@ -29,7 +29,7 @@ /* RealTek RTL8152/RTL8153 10/100/Gigabit USB Ethernet device */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.6 2019/05/23 13:10:52 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.7 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -412,6 +412,7 @@ ure_ifmedia_sts(struct ifnet *ifp, struc static void ure_iff(struct ure_softc *sc) { + struct ethercom *ec = &sc->ure_ec; struct ifnet *ifp = GET_IFP(sc); struct ether_multi *enm; struct ether_multistep step; @@ -440,11 +441,14 @@ allmulti: ifp->if_flags |= IFF_ALLMULTI; } else { rxmode |= URE_RCR_AM; - ETHER_FIRST_MULTI(step, &sc->ure_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN)) + ETHER_ADDR_LEN)) { + ETHER_UNLOCK(ec); goto allmulti; + } hash = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26; @@ -455,6 +459,7 @@ allmulti: ifp->if_flags |= IFF_ALLMULTI; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); hash = bswap32(hashes[0]); hashes[0] = bswap32(hashes[1]); Index: src/sys/dev/usb/if_url.c diff -u src/sys/dev/usb/if_url.c:1.64 src/sys/dev/usb/if_url.c:1.65 --- src/sys/dev/usb/if_url.c:1.64 Thu May 23 10:57:29 2019 +++ src/sys/dev/usb/if_url.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_url.c,v 1.64 2019/05/23 10:57:29 msaitoh Exp $ */ +/* $NetBSD: if_url.c,v 1.65 2019/05/28 07:41:50 msaitoh Exp $ */ /* * Copyright (c) 2001, 2002 @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.64 2019/05/23 10:57:29 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.65 2019/05/28 07:41:50 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -658,6 +658,7 @@ url_activate(device_t self, enum devact Static void url_setmulti(struct url_softc *sc) { + struct ethercom *ec = &sc->sc_ec; struct ifnet *ifp; struct ether_multi *enm; struct ether_multistep step; @@ -676,7 +677,7 @@ url_setmulti(struct url_softc *sc) URL_SETBIT2(sc, URL_RCR, URL_RCR_AAM | URL_RCR_AAP); return; } else if (ifp->if_flags & IFF_ALLMULTI) { - allmulti: +allmulti: ifp->if_flags |= IFF_ALLMULTI; URL_SETBIT2(sc, URL_RCR, URL_RCR_AAM); URL_CLRBIT2(sc, URL_RCR, URL_RCR_AAP); @@ -688,11 +689,14 @@ url_setmulti(struct url_softc *sc) url_csr_write_4(sc, URL_MAR4, 0); /* now program new ones */ - ETHER_FIRST_MULTI(step, &sc->sc_ec, enm); + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); while (enm != NULL) { if (memcmp(enm->enm_addrlo, enm->enm_addrhi, - ETHER_ADDR_LEN) != 0) + ETHER_ADDR_LEN) != 0) { + ETHER_UNLOCK(ec); goto allmulti; + } h = url_calchash(enm->enm_addrlo); if (h < 32) @@ -702,6 +706,7 @@ url_setmulti(struct url_softc *sc) mcnt++; ETHER_NEXT_MULTI(step, enm); } + ETHER_UNLOCK(ec); ifp->if_flags &= ~IFF_ALLMULTI; Index: src/usr.sbin/cpuctl/arch/i386.c diff -u src/usr.sbin/cpuctl/arch/i386.c:1.99 src/usr.sbin/cpuctl/arch/i386.c:1.100 --- src/usr.sbin/cpuctl/arch/i386.c:1.99 Tue May 21 05:29:21 2019 +++ src/usr.sbin/cpuctl/arch/i386.c Tue May 28 07:41:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i386.c,v 1.99 2019/05/21 05:29:21 mlelstv Exp $ */ +/* $NetBSD: i386.c,v 1.100 2019/05/28 07:41:50 msaitoh Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: i386.c,v 1.99 2019/05/21 05:29:21 mlelstv Exp $"); +__RCSID("$NetBSD: i386.c,v 1.100 2019/05/28 07:41:50 msaitoh Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -373,7 +373,7 @@ const struct cpu_cpuid_nameclass i386_cp [0x4d] = "Atom C2000", [0x4e] = "6th gen Core, Xeon E3-1[25]00 v5 (Skylake)", [0x4f] = "Xeon E[57] v4 (Broadwell), Core i7-69xx Extreme", - [0x55] = "Xeon Scalable (Skylake)", + [0x55] = "Xeon Scalable (Skylake, Cascade Lake, Copper Lake)", [0x56] = "Xeon D-1500 (Broadwell)", [0x57] = "Xeon Phi [357]200 (Knights Landing)", [0x5a] = "Atom E3500", @@ -381,13 +381,16 @@ const struct cpu_cpuid_nameclass i386_cp [0x5d] = "Atom X3-C3000 (Silvermont)", [0x5e] = "6th gen Core, Xeon E3-1[25]00 v5 (Skylake)", [0x5f] = "Atom (Goldmont, Denverton)", - [0x66] = "Future Core (Cannon Lake)", + [0x66] = "8th gen Core i3 (Cannon Lake)", + [0x6a] = "Future Xeon (Ice Lake)", + [0x6c] = "Future Xeon (Ice Lake)", [0x7a] = "Atom (Goldmont Plus)", + [0x7d] = "Future Core (Ice Lake)", [0x7e] = "Future Core (Ice Lake)", [0x85] = "Xeon Phi 7215, 7285, 7295 (Knights Mill)", [0x86] = "Atom (Tremont)", - [0x8e] = "7th or 8th gen Core (Kaby Lake, Coffee Lake)", - [0x9e] = "7th or 8th gen Core (Kaby Lake, Coffee Lake)", + [0x8e] = "7th or 8th gen Core (Kaby Lake, Coffee Lake) or Xeon E (Coffee Lake)", + [0x9e] = "7th or 8th gen Core (Kaby Lake, Coffee Lake) or Xeon E (Coffee Lake)", }, "Pentium Pro, II or III", /* Default */ NULL,