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,

Reply via email to