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;