Module Name:    src
Committed By:   nisimura
Date:           Thu Dec 12 12:00:06 UTC 2019

Modified Files:
        src/sys/dev/pci: if_kse.c

Log Message:
use additional MAC addresses to accept mcast


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/sys/dev/pci/if_kse.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/dev/pci/if_kse.c
diff -u src/sys/dev/pci/if_kse.c:1.44 src/sys/dev/pci/if_kse.c:1.45
--- src/sys/dev/pci/if_kse.c:1.44	Tue Dec  3 11:26:12 2019
+++ src/sys/dev/pci/if_kse.c	Thu Dec 12 12:00:06 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_kse.c,v 1.44 2019/12/03 11:26:12 nisimura Exp $	*/
+/*	$NetBSD: if_kse.c,v 1.45 2019/12/12 12:00:06 nisimura Exp $	*/
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1.44 2019/12/03 11:26:12 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1.45 2019/12/12 12:00:06 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -84,6 +84,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1
 #define MTR1	0x024	/* multicast table 63:32 */
 #define INTEN	0x028	/* interrupt enable */
 #define INTST	0x02c	/* interrupt status */
+#define MAAL0	0x080	/* additional MAC address 0 low */
+#define MAAH0	0x084	/* additional MAC address 0 high */
 #define MARL	0x200	/* MAC address low */
 #define MARM	0x202	/* MAC address middle */
 #define MARH	0x204	/* MAC address high */
@@ -1087,6 +1089,7 @@ kse_set_filter(struct kse_softc *sc)
 	struct ethercom *ec = &sc->sc_ethercom;
 	struct ifnet *ifp = &ec->ec_if;
 	uint32_t crc, mchash[2];
+	int i;
 
 	sc->sc_rxc &= ~(RXC_MHTE | RXC_RM | RXC_RA);
 	ifp->if_flags &= ~IFF_ALLMULTI;
@@ -1096,9 +1099,12 @@ kse_set_filter(struct kse_softc *sc)
 		goto update;
 	}
 
-	mchash[0] = mchash[1] = crc = 0;
+	for (i = 0; i < 16; i++)
+		 CSR_WRITE_4(sc, MAAH0 + i*8, 0);
+	crc = mchash[0] = mchash[1] = 0;
 	ETHER_LOCK(ec);
 	ETHER_FIRST_MULTI(step, ec, enm);
+	i = 0;
 	while (enm != NULL) {
 #if KSE_MCASTDEBUG == 1
 		printf("%s: addrs %s %s\n", __func__,
@@ -1118,9 +1124,22 @@ kse_set_filter(struct kse_softc *sc)
 			ifp->if_flags |= IFF_ALLMULTI;
 			goto update;
 		}
-		crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN);
-		mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f);
+		if (i < 16) {
+			/* use 16 additional MAC addr to accept mcast */
+			uint32_t addr;
+			uint8_t *ep = enm->enm_addrlo;
+			addr = (ep[3] << 24) | (ep[2] << 16)
+			     | (ep[1] << 8)  |  ep[0];
+			CSR_WRITE_4(sc, MAAL0 + i*8, addr);
+			addr = (ep[5] << 8) | ep[4] | (1U<<31);
+			CSR_WRITE_4(sc, MAAH0 + i*8, addr);
+		} else {
+			/* use hash table when too many */
+			crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN);
+			mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f);
+		}
 		ETHER_NEXT_MULTI(step, enm);
+		i++;
 	}
 	ETHER_UNLOCK(ec);
 

Reply via email to