Module Name:    src
Committed By:   martin
Date:           Tue Jan 28 11:01:37 UTC 2020

Modified Files:
        src/sys/arch/arm/omap [netbsd-9]: if_cpsw.c
        src/sys/arch/arm/ti [netbsd-9]: if_cpsw.c
        src/sys/arch/x86/pci [netbsd-9]: if_vmx.c
        src/sys/dev/isa [netbsd-9]: if_iy.c
        src/sys/dev/pci [netbsd-9]: if_de.c
        src/sys/dev/pcmcia [netbsd-9]: if_ray.c if_xi.c

Log Message:
Pull up following revision(s) (requested by msaitoh in ticket #662):

        sys/dev/pcmcia/if_xi.c: revision 1.93
        sys/arch/x86/pci/if_vmx.c: revision 1.54
        sys/dev/pci/if_de.c: revision 1.165
        sys/arch/arm/ti/if_cpsw.c: revision 1.10
        sys/arch/arm/omap/if_cpsw.c: revision 1.26
        sys/dev/isa/if_iy.c: revision 1.112
        sys/dev/pcmcia/if_ray.c: revision 1.96

Add ETHER_LOCK() and ETHER_UNLOCK() to protect ec_multiaddrs.

XXX These drivers don't check whether enm_addrlo and enm_addrhi are the same
or not, so it won't work correctly if an multicast address entry has a range.

Protect ec_multicnt.


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.25.2.1 src/sys/arch/arm/omap/if_cpsw.c
cvs rdiff -u -r1.6.2.1 -r1.6.2.2 src/sys/arch/arm/ti/if_cpsw.c
cvs rdiff -u -r1.45.2.5 -r1.45.2.6 src/sys/arch/x86/pci/if_vmx.c
cvs rdiff -u -r1.109.2.1 -r1.109.2.2 src/sys/dev/isa/if_iy.c
cvs rdiff -u -r1.163 -r1.163.2.1 src/sys/dev/pci/if_de.c
cvs rdiff -u -r1.94.2.1 -r1.94.2.2 src/sys/dev/pcmcia/if_ray.c
cvs rdiff -u -r1.90.2.1 -r1.90.2.2 src/sys/dev/pcmcia/if_xi.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/omap/if_cpsw.c
diff -u src/sys/arch/arm/omap/if_cpsw.c:1.25 src/sys/arch/arm/omap/if_cpsw.c:1.25.2.1
--- src/sys/arch/arm/omap/if_cpsw.c:1.25	Wed May 29 06:17:27 2019
+++ src/sys/arch/arm/omap/if_cpsw.c	Tue Jan 28 11:01:37 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_cpsw.c,v 1.25 2019/05/29 06:17:27 msaitoh Exp $	*/
+/*	$NetBSD: if_cpsw.c,v 1.25.2.1 2020/01/28 11:01:37 martin Exp $	*/
 
 /*
  * Copyright (c) 2013 Jonathan A. Kollasch
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: if_cpsw.c,v 1.25 2019/05/29 06:17:27 msaitoh Exp $");
+__KERNEL_RCSID(1, "$NetBSD: if_cpsw.c,v 1.25.2.1 2020/01/28 11:01:37 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -1543,9 +1543,11 @@ cpsw_ale_update_addresses(struct cpsw_so
 		cpsw_ale_remove_all_mc_entries(sc);
 
 	/* Set other multicast addrs desired. */
+	ETHER_LOCK(ec);
 	LIST_FOREACH(ifma, &ec->ec_multiaddrs, enm_list) {
 		cpsw_ale_mc_entry_set(sc, ALE_PORT_MASK_ALL, ifma->enm_addrlo);
 	}
+	ETHER_UNLOCK(ec);
 
 	return 0;
 }

Index: src/sys/arch/arm/ti/if_cpsw.c
diff -u src/sys/arch/arm/ti/if_cpsw.c:1.6.2.1 src/sys/arch/arm/ti/if_cpsw.c:1.6.2.2
--- src/sys/arch/arm/ti/if_cpsw.c:1.6.2.1	Wed Nov 27 13:46:45 2019
+++ src/sys/arch/arm/ti/if_cpsw.c	Tue Jan 28 11:01:37 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_cpsw.c,v 1.6.2.1 2019/11/27 13:46:45 martin Exp $	*/
+/*	$NetBSD: if_cpsw.c,v 1.6.2.2 2020/01/28 11:01:37 martin Exp $	*/
 
 /*
  * Copyright (c) 2013 Jonathan A. Kollasch
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: if_cpsw.c,v 1.6.2.1 2019/11/27 13:46:45 martin Exp $");
+__KERNEL_RCSID(1, "$NetBSD: if_cpsw.c,v 1.6.2.2 2020/01/28 11:01:37 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -1555,9 +1555,11 @@ cpsw_ale_update_addresses(struct cpsw_so
 		cpsw_ale_remove_all_mc_entries(sc);
 
 	/* Set other multicast addrs desired. */
+	ETHER_LOCK(ec);
 	LIST_FOREACH(ifma, &ec->ec_multiaddrs, enm_list) {
 		cpsw_ale_mc_entry_set(sc, ALE_PORT_MASK_ALL, ifma->enm_addrlo);
 	}
+	ETHER_UNLOCK(ec);
 
 	return 0;
 }

Index: src/sys/arch/x86/pci/if_vmx.c
diff -u src/sys/arch/x86/pci/if_vmx.c:1.45.2.5 src/sys/arch/x86/pci/if_vmx.c:1.45.2.6
--- src/sys/arch/x86/pci/if_vmx.c:1.45.2.5	Thu Dec 26 20:19:37 2019
+++ src/sys/arch/x86/pci/if_vmx.c	Tue Jan 28 11:01:37 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_vmx.c,v 1.45.2.5 2019/12/26 20:19:37 martin Exp $	*/
+/*	$NetBSD: if_vmx.c,v 1.45.2.6 2020/01/28 11:01:37 martin Exp $	*/
 /*	$OpenBSD: if_vmx.c,v 1.16 2014/01/22 06:04:17 brad Exp $	*/
 
 /*
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.45.2.5 2019/12/26 20:19:37 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.45.2.6 2020/01/28 11:01:37 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -3320,16 +3320,15 @@ vmxnet3_set_rxfilter(struct vmxnet3_soft
 	 */
 	mode = VMXNET3_RXMODE_BCAST | VMXNET3_RXMODE_UCAST;
 
+	ETHER_LOCK(ec);
 	if (ISSET(ifp->if_flags, IFF_PROMISC) ||
 	    ec->ec_multicnt > VMXNET3_MULTICAST_MAX)
 		goto allmulti;
 
 	p = sc->vmx_mcast;
-	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);
 			/*
 			 * We must listen to a range of multicast addresses.
 			 * For now, just accept all multicasts, rather than
@@ -3346,17 +3345,16 @@ vmxnet3_set_rxfilter(struct vmxnet3_soft
 
 		ETHER_NEXT_MULTI(step, enm);
 	}
-	ETHER_UNLOCK(ec);
 
 	if (ec->ec_multicnt > 0) {
 		SET(mode, VMXNET3_RXMODE_MCAST);
 		ds->mcast_tablelen = p - sc->vmx_mcast;
 	}
+	ETHER_UNLOCK(ec);
 
 	goto setit;
 
 allmulti:
-	ETHER_LOCK(ec);
 	SET(ec->ec_flags, ETHER_F_ALLMULTI);
 	ETHER_UNLOCK(ec);
 	SET(mode, (VMXNET3_RXMODE_ALLMULTI | VMXNET3_RXMODE_MCAST));

Index: src/sys/dev/isa/if_iy.c
diff -u src/sys/dev/isa/if_iy.c:1.109.2.1 src/sys/dev/isa/if_iy.c:1.109.2.2
--- src/sys/dev/isa/if_iy.c:1.109.2.1	Thu Nov 14 15:38:02 2019
+++ src/sys/dev/isa/if_iy.c	Tue Jan 28 11:01:37 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_iy.c,v 1.109.2.1 2019/11/14 15:38:02 martin Exp $	*/
+/*	$NetBSD: if_iy.c,v 1.109.2.2 2020/01/28 11:01:37 martin Exp $	*/
 /* #define IYDEBUG */
 /* #define IYMEMDEBUG */
 
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iy.c,v 1.109.2.1 2019/11/14 15:38:02 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iy.c,v 1.109.2.2 2020/01/28 11:01:37 martin Exp $");
 
 #include "opt_inet.h"
 
@@ -1305,6 +1305,7 @@ iy_mc_setup(struct iy_softc *sc)
 	iot = sc->sc_iot;
 	ioh = sc->sc_ioh;
 
+	ETHER_LOCK(ecp);
 	len = 6 * ecp->ec_multicnt;
 
 	avail = sc->tx_start - sc->tx_end;
@@ -1330,7 +1331,6 @@ 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) {
 		/*

Index: src/sys/dev/pci/if_de.c
diff -u src/sys/dev/pci/if_de.c:1.163 src/sys/dev/pci/if_de.c:1.163.2.1
--- src/sys/dev/pci/if_de.c:1.163	Wed May 29 10:07:29 2019
+++ src/sys/dev/pci/if_de.c	Tue Jan 28 11:01:37 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_de.c,v 1.163 2019/05/29 10:07:29 msaitoh Exp $	*/
+/*	$NetBSD: if_de.c,v 1.163.2.1 2020/01/28 11:01:37 martin Exp $	*/
 
 /*-
  * Copyright (c) 1994-1997 Matt Thomas ([email protected])
@@ -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.163 2019/05/29 10:07:29 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.163.2.1 2020/01/28 11:01:37 martin Exp $");
 
 #define	TULIP_HDR_DATA
 
@@ -3218,6 +3218,7 @@ tulip_addr_filter(tulip_softc_t * const 
 	sc->tulip_if.if_flags &= ~IFF_ALLMULTI;
 #endif
 	sc->tulip_if.if_start = tulip_ifstart;	/* so the setup packet gets queued */
+	ETHER_LOCK(ec);
 	if (sc->tulip_multicnt > 14) {
 		uint32_t *sp = sc->tulip_setupdata;
 		unsigned hash;
@@ -3238,7 +3239,6 @@ tulip_addr_filter(tulip_softc_t * const 
 		 * hardware).
 		 */
 		memset(sc->tulip_setupdata, 0, sizeof(sc->tulip_setupdata));
-		ETHER_LOCK(ec);
 		ETHER_FIRST_MULTI(step, ec, enm);
 		while (enm != NULL) {
 			if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) == 0) {
@@ -3256,7 +3256,6 @@ 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.
@@ -3288,6 +3287,7 @@ tulip_addr_filter(tulip_softc_t * const 
 			}
 		}
 	}
+	ETHER_UNLOCK(ec);
 	if ((sc->tulip_flags & (TULIP_WANTHASHPERFECT | TULIP_WANTHASHONLY))
 	    == 0) {
 		uint32_t *sp = sc->tulip_setupdata;

Index: src/sys/dev/pcmcia/if_ray.c
diff -u src/sys/dev/pcmcia/if_ray.c:1.94.2.1 src/sys/dev/pcmcia/if_ray.c:1.94.2.2
--- src/sys/dev/pcmcia/if_ray.c:1.94.2.1	Wed Oct 23 19:43:24 2019
+++ src/sys/dev/pcmcia/if_ray.c	Tue Jan 28 11:01:37 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ray.c,v 1.94.2.1 2019/10/23 19:43:24 martin Exp $	*/
+/*	$NetBSD: if_ray.c,v 1.94.2.2 2020/01/28 11:01:37 martin Exp $	*/
 
 /*
  * Copyright (c) 2000 Christian E. Hopps
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ray.c,v 1.94.2.1 2019/10/23 19:43:24 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ray.c,v 1.94.2.2 2020/01/28 11:01:37 martin Exp $");
 
 #include "opt_inet.h"
 
@@ -2824,9 +2824,9 @@ ray_update_mcast(struct ray_softc *sc)
 	ec = &sc->sc_ec;
 	ray_cmd_cancel(sc, SCP_UPD_MCAST);
 
+	ETHER_LOCK(ec);
 	/* 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,8 +2837,8 @@ ray_update_mcast(struct ray_softc *sc)
 			}
 			ETHER_NEXT_MULTI(step, enm);
 		}
-		ETHER_UNLOCK(ec);
 	}
+	ETHER_UNLOCK(ec);
 
 	/* track this stuff even when not running */
 	if (count > 16) {

Index: src/sys/dev/pcmcia/if_xi.c
diff -u src/sys/dev/pcmcia/if_xi.c:1.90.2.1 src/sys/dev/pcmcia/if_xi.c:1.90.2.2
--- src/sys/dev/pcmcia/if_xi.c:1.90.2.1	Wed Nov  6 09:59:38 2019
+++ src/sys/dev/pcmcia/if_xi.c	Tue Jan 28 11:01:37 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_xi.c,v 1.90.2.1 2019/11/06 09:59:38 martin Exp $ */
+/*	$NetBSD: if_xi.c,v 1.90.2.2 2020/01/28 11:01:37 martin 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.90.2.1 2019/11/06 09:59:38 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_xi.c,v 1.90.2.2 2020/01/28 11:01:37 martin Exp $");
 
 #include "opt_inet.h"
 
@@ -964,12 +964,12 @@ xi_set_address(struct xi_softc *sc)
 			indaddr[i] = enaddr[i];
 	num = 1;
 
+	ETHER_LOCK(ec);
 	if (ec->ec_multicnt > 9) {
 		ifp->if_flags |= IFF_ALLMULTI;
 		goto done;
 	}
 
-	ETHER_LOCK(ec);
 	ETHER_FIRST_MULTI(step, ec, enm);
 	for (; enm; num++) {
 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
@@ -980,7 +980,6 @@ 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)
@@ -991,10 +990,10 @@ 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:
+	ETHER_UNLOCK(ec);
 	if (num < 10)
 		memset(&indaddr[num * 6], 0xff, 6 * (10 - num));
 

Reply via email to