Module Name: src Committed By: nisimura Date: Fri Mar 27 18:04:45 UTC 2020
Modified Files: src/sys/dev/usb: if_axe.c if_ure.c Log Message: - change to use rcvfilt_locked() name to clarify the intent. - stylise receive filter manipulation logic. - use ETHER_F_ALLMULTI flag. To generate a diff of this commit: cvs rdiff -u -r1.130 -r1.131 src/sys/dev/usb/if_axe.c cvs rdiff -u -r1.39 -r1.40 src/sys/dev/usb/if_ure.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_axe.c diff -u src/sys/dev/usb/if_axe.c:1.130 src/sys/dev/usb/if_axe.c:1.131 --- src/sys/dev/usb/if_axe.c:1.130 Sun Mar 15 23:04:50 2020 +++ src/sys/dev/usb/if_axe.c Fri Mar 27 18:04:45 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axe.c,v 1.130 2020/03/15 23:04:50 thorpej Exp $ */ +/* $NetBSD: if_axe.c,v 1.131 2020/03/27 18:04:45 nisimura 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.130 2020/03/15 23:04:50 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.131 2020/03/27 18:04:45 nisimura Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -426,7 +426,7 @@ axe_uno_mii_statchg(struct ifnet *ifp) } static void -axe_setiff_locked(struct usbnet *un) +axe_rcvfilt_locked(struct usbnet *un) { AXEHIST_FUNC(); AXEHIST_CALLED(); struct axe_softc * const sc = usbnet_softc(un); @@ -434,9 +434,9 @@ axe_setiff_locked(struct usbnet *un) struct ethercom *ec = usbnet_ec(un); struct ether_multi *enm; struct ether_multistep step; - uint32_t h = 0; uint16_t rxmode; - uint8_t hashtbl[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + uint32_t h = 0; + uint8_t mchash[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; if (usbnet_isdying(un)) return; @@ -450,38 +450,34 @@ axe_setiff_locked(struct usbnet *un) rxmode &= ~(AXE_RXCMD_ALLMULTI | AXE_RXCMD_PROMISC | AXE_RXCMD_MULTICAST); + ETHER_LOCK(ec); if (ifp->if_flags & IFF_PROMISC) { - ifp->if_flags |= IFF_ALLMULTI; - goto allmulti; + ec->ec_flags |= ETHER_F_ALLMULTI; + ETHER_UNLOCK(ec); + /* run promisc. mode */ + rxmode |= AXE_RXCMD_ALLMULTI; /* ??? */ + rxmode |= AXE_RXCMD_PROMISC; + goto update; } - ifp->if_flags &= ~IFF_ALLMULTI; - - /* Now program new ones */ - ETHER_LOCK(ec); + 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); - ifp->if_flags |= IFF_ALLMULTI; - goto allmulti; + /* accept all mcast frames */ + rxmode |= AXE_RXCMD_ALLMULTI; + goto update; } - - h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26; - hashtbl[h >> 3] |= 1U << (h & 7); + h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN); + mchash[h >> 29] |= 1U << ((h >> 26) & 7); ETHER_NEXT_MULTI(step, enm); } ETHER_UNLOCK(ec); - - rxmode |= AXE_RXCMD_MULTICAST; /* activate mcast hash filter */ - axe_cmd(sc, AXE_CMD_WRITE_MCAST, 0, 0, hashtbl); - axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL); - return; - - allmulti: - if (ifp->if_flags & IFF_PROMISC) - rxmode |= AXE_RXCMD_PROMISC; /* run promisc. mode */ - rxmode |= AXE_RXCMD_ALLMULTI; /* accept all mcast frames */ + if (h != 0) + rxmode |= AXE_RXCMD_MULTICAST; /* activate mcast hash filter */ + axe_cmd(sc, AXE_CMD_WRITE_MCAST, 0, 0, mchash); + update: axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL); } @@ -1311,7 +1307,7 @@ axe_init_locked(struct ifnet *ifp) axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL); /* Accept multicast frame or run promisc. mode */ - axe_setiff_locked(un); + axe_rcvfilt_locked(un); return usbnet_init_rx_tx(un); } @@ -1341,7 +1337,7 @@ axe_uno_ioctl(struct ifnet *ifp, u_long switch (cmd) { case SIOCADDMULTI: case SIOCDELMULTI: - axe_setiff_locked(un); + axe_rcvfilt_locked(un); break; default: break; Index: src/sys/dev/usb/if_ure.c diff -u src/sys/dev/usb/if_ure.c:1.39 src/sys/dev/usb/if_ure.c:1.40 --- src/sys/dev/usb/if_ure.c:1.39 Sat Mar 21 06:54:43 2020 +++ src/sys/dev/usb/if_ure.c Fri Mar 27 18:04:45 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ure.c,v 1.39 2020/03/21 06:54:43 skrll Exp $ */ +/* $NetBSD: if_ure.c,v 1.40 2020/03/27 18:04:45 nisimura Exp $ */ /* $OpenBSD: if_ure.c,v 1.10 2018/11/02 21:32:30 jcs Exp $ */ /*- @@ -30,7 +30,7 @@ /* RealTek RTL8152/RTL8153 10/100/Gigabit USB Ethernet device */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.39 2020/03/21 06:54:43 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.40 2020/03/27 18:04:45 nisimura Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -331,15 +331,14 @@ ure_uno_miibus_statchg(struct ifnet *ifp } static void -ure_setiff_locked(struct usbnet *un) +ure_rcvfilt_locked(struct usbnet *un) { struct ethercom *ec = usbnet_ec(un); struct ifnet *ifp = usbnet_ifp(un); struct ether_multi *enm; struct ether_multistep step; - uint32_t hashes[2] = { 0, 0 }; - uint32_t hash; - uint32_t rxmode; + uint32_t mchash[2] = { 0, 0 }; + uint32_t h = 0, rxmode; usbnet_isowned_core(un); @@ -347,54 +346,43 @@ ure_setiff_locked(struct usbnet *un) return; rxmode = ure_read_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA); - rxmode &= ~URE_RCR_ACPT_ALL; - - /* - * Always accept frames destined to our station address. - * Always accept broadcast frames. - */ - rxmode |= URE_RCR_APM | URE_RCR_AB; + rxmode &= ~(URE_RCR_AAP | URE_RCR_AM); + /* continue to accept my own DA and bcast frames */ + ETHER_LOCK(ec); if (ifp->if_flags & IFF_PROMISC) { - rxmode |= URE_RCR_AAP; -allmulti: - ETHER_LOCK(ec); ec->ec_flags |= ETHER_F_ALLMULTI; ETHER_UNLOCK(ec); - rxmode |= URE_RCR_AM; - hashes[0] = hashes[1] = 0xffffffff; - } else { - rxmode |= URE_RCR_AM; - - ETHER_LOCK(ec); - 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)) { - ETHER_UNLOCK(ec); - goto allmulti; - } - - hash = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) - >> 26; - if (hash < 32) - hashes[0] |= (1 << hash); - else - hashes[1] |= (1 << (hash - 32)); - - ETHER_NEXT_MULTI(step, enm); - } - ETHER_UNLOCK(ec); - - hash = bswap32(hashes[0]); - hashes[0] = bswap32(hashes[1]); - hashes[1] = hash; + /* run promisc. mode */ + rxmode |= URE_RCR_AM; /* ??? */ + rxmode |= URE_RCR_AAP; + goto update; } - - ure_write_4(un, URE_PLA_MAR0, URE_MCU_TYPE_PLA, hashes[0]); - ure_write_4(un, URE_PLA_MAR4, URE_MCU_TYPE_PLA, hashes[1]); + 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)) { + ec->ec_flags |= ETHER_F_ALLMULTI; + ETHER_UNLOCK(ec); + /* accept all mcast frames */ + rxmode |= URE_RCR_AM; + mchash[0] = mchash[1] = ~0U; /* necessary ?? */ + goto update; + } + h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN); + mchash[h >> 31] |= 1 << ((h >> 26) & 0x1f); + ETHER_NEXT_MULTI(step, enm); + } + ETHER_UNLOCK(ec); + if (h != 0) { + rxmode |= URE_RCR_AM; /* activate mcast hash filter */ + h = bswap32(mchash[0]); + mchash[0] = bswap32(mchash[1]); + mchash[1] = h; + } + update: + ure_write_4(un, URE_PLA_MAR0, URE_MCU_TYPE_PLA, mchash[0]); + ure_write_4(un, URE_PLA_MAR4, URE_MCU_TYPE_PLA, mchash[1]); ure_write_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA, rxmode); } @@ -457,8 +445,8 @@ ure_init_locked(struct ifnet *ifp) ure_read_2(un, URE_PLA_MISC_1, URE_MCU_TYPE_PLA) & ~URE_RXDY_GATED_EN); - /* Load the multicast filter. */ - ure_setiff_locked(un); + /* Accept multicast frame or run promisc. mode. */ + ure_rcvfilt_locked(un); return usbnet_init_rx_tx(un); } @@ -701,7 +689,7 @@ ure_disable_teredo(struct usbnet *un) static void ure_init_fifo(struct usbnet *un) { - uint32_t rx_fifo1, rx_fifo2; + uint32_t rxmode, rx_fifo1, rx_fifo2; int i; ure_write_2(un, URE_PLA_MISC_1, URE_MCU_TYPE_PLA, @@ -710,9 +698,10 @@ ure_init_fifo(struct usbnet *un) ure_disable_teredo(un); - ure_write_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA, - ure_read_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA) & - ~URE_RCR_ACPT_ALL); + rxmode = ure_read_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA); + rxmode &= ~URE_RCR_ACPT_ALL; + rxmode |= URE_RCR_APM | URE_RCR_AB; /* accept my own DA and bcast */ + ure_write_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA, rxmode); if (!(un->un_flags & URE_FLAG_8152)) { if (un->un_flags & (URE_FLAG_VER_5C00 | URE_FLAG_VER_5C10 | @@ -816,7 +805,7 @@ ure_uno_ioctl(struct ifnet *ifp, u_long switch (cmd) { case SIOCADDMULTI: case SIOCDELMULTI: - ure_setiff_locked(un); + ure_rcvfilt_locked(un); break; default: break;