diff options
| author | martin <martin@NetBSD.org> | 2019-08-09 16:15:06 +0000 |
|---|---|---|
| committer | martin <martin@NetBSD.org> | 2019-08-09 16:15:06 +0000 |
| commit | 2b3342aafb0979af4d9089d92bcdd2f044dc6f21 (patch) | |
| tree | c02f9703b8899b81f71cf651bb2b279d1bab44ac /sys/dev/usb | |
| parent | edb5db56f4a30ef936191bb3db12953ff0828b0b (diff) | |
Pull up following revision(s) (requested by msaitoh in ticket #39):
sys/dev/usb/if_aue.c: revision 1.156
Fix panic when setting multicast addresses. Write the hash table outside of
ETHER_LOC()/ETHER_UNLOCK().
Diffstat (limited to 'sys/dev/usb')
| -rw-r--r-- | sys/dev/usb/if_aue.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/dev/usb/if_aue.c b/sys/dev/usb/if_aue.c index f333496c10f..0285a255289 100644 --- a/sys/dev/usb/if_aue.c +++ b/sys/dev/usb/if_aue.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_aue.c,v 1.154 2019/05/28 07:41:50 msaitoh Exp $ */ +/* $NetBSD: if_aue.c,v 1.154.2.1 2019/08/09 16:15:06 martin Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.154 2019/05/28 07:41:50 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.154.2.1 2019/08/09 16:15:06 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -587,6 +587,7 @@ aue_setmulti(struct aue_softc *sc) struct ether_multi *enm; struct ether_multistep step; uint32_t h = 0, i; + uint8_t hashtbl[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; DPRINTFN(5,("%s: %s: enter\n", device_xname(sc->aue_dev), __func__)); @@ -601,10 +602,6 @@ allmulti: AUE_CLRBIT(sc, AUE_CTL0, AUE_CTL0_ALLMULTI); - /* first, zot all the existing hash bits */ - for (i = 0; i < 8; i++) - aue_csr_write_1(sc, AUE_MAR0 + i, 0); - /* now program new ones */ ETHER_LOCK(ec); ETHER_FIRST_MULTI(step, ec, enm); @@ -616,11 +613,15 @@ allmulti: } h = aue_crc(enm->enm_addrlo); - AUE_SETBIT(sc, AUE_MAR + (h >> 3), 1 << (h & 0x7)); + hashtbl[h >> 3] |= 1 << (h & 0x7); ETHER_NEXT_MULTI(step, enm); } ETHER_UNLOCK(ec); + /* write the hashtable */ + for (i = 0; i < 8; i++) + aue_csr_write_1(sc, AUE_MAR0 + i, hashtbl[i]); + ifp->if_flags &= ~IFF_ALLMULTI; } |
