Module Name:    src
Committed By:   nisimura
Date:           Thu Apr  2 04:09:36 UTC 2020

Modified Files:
        src/sys/dev/usb: if_mos.c if_url.c

Log Message:
iron out multicast filter logic and pick better name for its work


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/usb/if_mos.c
cvs rdiff -u -r1.76 -r1.77 src/sys/dev/usb/if_url.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/usb/if_mos.c
diff -u src/sys/dev/usb/if_mos.c:1.6 src/sys/dev/usb/if_mos.c:1.7
--- src/sys/dev/usb/if_mos.c:1.6	Tue Mar 31 23:26:32 2020
+++ src/sys/dev/usb/if_mos.c	Thu Apr  2 04:09:36 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_mos.c,v 1.6 2020/03/31 23:26:32 nisimura Exp $	*/
+/*	$NetBSD: if_mos.c,v 1.7 2020/04/02 04:09:36 nisimura Exp $	*/
 /*	$OpenBSD: if_mos.c,v 1.40 2019/07/07 06:40:10 kevlo Exp $	*/
 
 /*
@@ -72,7 +72,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mos.c,v 1.6 2020/03/31 23:26:32 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mos.c,v 1.7 2020/04/02 04:09:36 nisimura Exp $");
 
 #include <sys/param.h>
 
@@ -485,7 +485,7 @@ mos_rcvfilt_locked(struct usbnet *un)
 			ec->ec_flags |= ETHER_F_ALLMULTI;
 			ETHER_UNLOCK(ec);
 			memset(mchash, 0, sizeof(mchash)); /* correct ??? */
-			/* accept all mulicast frame */
+			/* accept all multicast frame */
 			rxmode |= MOS_CTL_ALLMULTI;
 			goto update;
 		}
@@ -743,7 +743,7 @@ mos_init_locked(struct ifnet *ifp)
 	mos_reg_write_1(un, MOS_IPG0, ipgs[0]);
 	mos_reg_write_1(un, MOS_IPG1, ipgs[1]);
 
-	/* Program promiscuous mode and multicast filters. */
+	/* Accept multicast frame or run promisc. mode */
 	mos_rcvfilt_locked(un);
 
 	/* Enable receiver and transmitter, bridge controls speed/duplex mode */

Index: src/sys/dev/usb/if_url.c
diff -u src/sys/dev/usb/if_url.c:1.76 src/sys/dev/usb/if_url.c:1.77
--- src/sys/dev/usb/if_url.c:1.76	Sun Mar 15 23:04:51 2020
+++ src/sys/dev/usb/if_url.c	Thu Apr  2 04:09:36 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_url.c,v 1.76 2020/03/15 23:04:51 thorpej Exp $	*/
+/*	$NetBSD: if_url.c,v 1.77 2020/04/02 04:09:36 nisimura Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.76 2020/03/15 23:04:51 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.77 2020/04/02 04:09:36 nisimura Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -81,7 +81,7 @@ static int url_uno_ioctl(struct ifnet *,
 static void url_uno_stop(struct ifnet *, int);
 static void url_uno_mii_statchg(struct ifnet *);
 static int url_uno_init(struct ifnet *);
-static void url_setiff_locked(struct usbnet *);
+static void url_rcvfilt_locked(struct usbnet *);
 static void url_reset(struct usbnet *);
 
 static int url_csr_read_1(struct usbnet *, int);
@@ -398,20 +398,10 @@ url_init_locked(struct ifnet *ifp)
 		   URL_TCR_NOCRC);
 
 	/* Init receive control register */
-	URL_SETBIT2(un, URL_RCR, URL_RCR_TAIL | URL_RCR_AD);
-	if (ifp->if_flags & IFF_BROADCAST)
-		URL_SETBIT2(un, URL_RCR, URL_RCR_AB);
-	else
-		URL_CLRBIT2(un, URL_RCR, URL_RCR_AB);
-
-	/* If we want promiscuous mode, accept all physical frames. */
-	if (ifp->if_flags & IFF_PROMISC)
-		URL_SETBIT2(un, URL_RCR, URL_RCR_AAM | URL_RCR_AAP);
-	else
-		URL_CLRBIT2(un, URL_RCR, URL_RCR_AAM | URL_RCR_AAP);
+	URL_SETBIT2(un, URL_RCR, URL_RCR_TAIL | URL_RCR_AD | URL_RCR_AB);
 
-	/* Load the multicast filter */
-	url_setiff_locked(un);
+	/* Accept multicast frame or run promisc. mode */
+	url_rcvfilt_locked(un);
 
 	/* Enable RX and TX */
 	URL_SETBIT(un, URL_CR, URL_CR_TE | URL_CR_RE);
@@ -454,18 +444,15 @@ url_reset(struct usbnet *un)
 	delay(10000);		/* XXX */
 }
 
-#define url_calchash(addr) (ether_crc32_be((addr), ETHER_ADDR_LEN) >> 26)
-
 static void
-url_setiff_locked(struct usbnet *un)
+url_rcvfilt_locked(struct usbnet *un)
 {
 	struct ifnet * const ifp = usbnet_ifp(un);
 	struct ethercom *ec = usbnet_ec(un);
 	struct ether_multi *enm;
 	struct ether_multistep step;
-	uint32_t hashes[2] = { 0, 0 };
-	int h = 0;
-	int mcnt = 0;
+	uint32_t mchash[2] = { 0, 0 };
+	int h = 0, rcr;
 
 	DPRINTF(("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
@@ -474,52 +461,40 @@ url_setiff_locked(struct usbnet *un)
 	if (usbnet_isdying(un))
 		return;
 
-	if (ifp->if_flags & IFF_PROMISC) {
-		URL_SETBIT2(un, URL_RCR, URL_RCR_AAM | URL_RCR_AAP);
-		return;
-	} else if (ifp->if_flags & IFF_ALLMULTI) {
-allmulti:
-		ifp->if_flags |= IFF_ALLMULTI;
-		URL_SETBIT2(un, URL_RCR, URL_RCR_AAM);
-		URL_CLRBIT2(un, URL_RCR, URL_RCR_AAP);
-		return;
-	}
-
-	/* first, zot all the existing hash bits */
-	url_csr_write_4(un, URL_MAR0, 0);
-	url_csr_write_4(un, URL_MAR4, 0);
+	rcr = url_csr_read_2(un, URL_RCR);
+	rcr &= ~(URL_RCR_AAP | URL_RCR_AAM | URL_RCR_AM);
 
-	/* now program new ones */
 	ETHER_LOCK(ec);
+	if (ifp->if_flags & IFF_PROMISC) {
+		ec->ec_flags |= ETHER_F_ALLMULTI;
+		ETHER_UNLOCK(ec);
+		/* run promisc. mode */
+		rcr |= URL_RCR_AAM; /* ??? */
+		rcr |= URL_RCR_AAP;
+		goto update;
+	}
+	ec->ec_flags &= ~ETHER_F_ALLMULTI;
 	ETHER_FIRST_MULTI(step, ec, enm);
 	while (enm != NULL) {
-		if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
-		    ETHER_ADDR_LEN) != 0) {
+		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
+			ec->ec_flags |= ETHER_F_ALLMULTI;
 			ETHER_UNLOCK(ec);
-			goto allmulti;
+			/* accept all multicast frames */
+			rcr |= URL_RCR_AAM;
+			goto update;
 		}
-
-		h = url_calchash(enm->enm_addrlo);
-		if (h < 32)
-			hashes[0] |= (1 << h);
-		else
-			hashes[1] |= (1 << (h -32));
-		mcnt++;
+		h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN);
+		/* 1(31) and 5(30:26) bit sampling */
+		mchash[h >> 31] |= 1 << ((h >> 26) & 0x1f);
 		ETHER_NEXT_MULTI(step, enm);
 	}
 	ETHER_UNLOCK(ec);
-
-	ifp->if_flags &= ~IFF_ALLMULTI;
-
-	URL_CLRBIT2(un, URL_RCR, URL_RCR_AAM | URL_RCR_AAP);
-
-	if (mcnt) {
-		URL_SETBIT2(un, URL_RCR, URL_RCR_AM);
-	} else {
-		URL_CLRBIT2(un, URL_RCR, URL_RCR_AM);
-	}
-	url_csr_write_4(un, URL_MAR0, hashes[0]);
-	url_csr_write_4(un, URL_MAR4, hashes[1]);
+	if (h != 0)
+		rcr |= URL_RCR_AM;	/* activate mcast hash filter */
+	url_csr_write_4(un, URL_MAR0, mchash[0]);
+	url_csr_write_4(un, URL_MAR4, mchash[1]);
+ update:
+	url_csr_write_2(un, URL_RCR, rcr);
 }
 
 static unsigned
@@ -601,7 +576,7 @@ url_uno_ioctl(struct ifnet *ifp, u_long 
 	switch (cmd) {
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
-		url_setiff_locked(un);
+		url_rcvfilt_locked(un);
 		break;
 	default:
 		break;

Reply via email to