Sat Dec 22 16:58:51 2018 UTC ()
Fix previous; We also need to turn off IFF_ALLMULTI bit when
it is disabled.


(rin)
diff -r1.24 -r1.25 src/sys/dev/usb/if_mue.c

cvs diff -r1.24 -r1.25 src/sys/dev/usb/if_mue.c (expand / switch to unified diff)

--- src/sys/dev/usb/if_mue.c 2018/12/20 02:52:59 1.24
+++ src/sys/dev/usb/if_mue.c 2018/12/22 16:58:51 1.25
@@ -1,36 +1,36 @@ @@ -1,36 +1,36 @@
1/* $NetBSD: if_mue.c,v 1.24 2018/12/20 02:52:59 rin Exp $ */ 1/* $NetBSD: if_mue.c,v 1.25 2018/12/22 16:58:51 rin Exp $ */
2/* $OpenBSD: if_mue.c,v 1.3 2018/08/04 16:42:46 jsg Exp $ */ 2/* $OpenBSD: if_mue.c,v 1.3 2018/08/04 16:42:46 jsg Exp $ */
3 3
4/* 4/*
5 * Copyright (c) 2018 Kevin Lo <kevlo@openbsd.org> 5 * Copyright (c) 2018 Kevin Lo <kevlo@openbsd.org>
6 * 6 *
7 * Permission to use, copy, modify, and distribute this software for any 7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above 8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies. 9 * copyright notice and this permission notice appear in all copies.
10 * 10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */ 18 */
19 19
20/* Driver for Microchip LAN7500/LAN7800 chipsets. */ 20/* Driver for Microchip LAN7500/LAN7800 chipsets. */
21 21
22#include <sys/cdefs.h> 22#include <sys/cdefs.h>
23__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.24 2018/12/20 02:52:59 rin Exp $"); 23__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.25 2018/12/22 16:58:51 rin Exp $");
24 24
25#ifdef _KERNEL_OPT 25#ifdef _KERNEL_OPT
26#include "opt_usb.h" 26#include "opt_usb.h"
27#include "opt_inet.h" 27#include "opt_inet.h"
28#endif 28#endif
29 29
30#include <sys/param.h> 30#include <sys/param.h>
31#include <sys/bus.h> 31#include <sys/bus.h>
32#include <sys/systm.h> 32#include <sys/systm.h>
33#include <sys/sockio.h> 33#include <sys/sockio.h>
34#include <sys/mbuf.h> 34#include <sys/mbuf.h>
35#include <sys/mutex.h> 35#include <sys/mutex.h>
36#include <sys/kernel.h> 36#include <sys/kernel.h>
@@ -1320,31 +1320,31 @@ mue_setmulti(struct mue_softc *sc) @@ -1320,31 +1320,31 @@ mue_setmulti(struct mue_softc *sc)
1320 1320
1321 /* Clear perfect filter and hash tables. */ 1321 /* Clear perfect filter and hash tables. */
1322 memset(pfiltbl, 0, sizeof(pfiltbl)); 1322 memset(pfiltbl, 0, sizeof(pfiltbl));
1323 memset(hashtbl, 0, sizeof(hashtbl)); 1323 memset(hashtbl, 0, sizeof(hashtbl));
1324 1324
1325 reg = (sc->mue_flags & LAN7500) ? MUE_7500_RFE_CTL : MUE_7800_RFE_CTL; 1325 reg = (sc->mue_flags & LAN7500) ? MUE_7500_RFE_CTL : MUE_7800_RFE_CTL;
1326 rxfilt = mue_csr_read(sc, reg); 1326 rxfilt = mue_csr_read(sc, reg);
1327 rxfilt &= ~(MUE_RFE_CTL_PERFECT | MUE_RFE_CTL_MULTICAST_HASH | 1327 rxfilt &= ~(MUE_RFE_CTL_PERFECT | MUE_RFE_CTL_MULTICAST_HASH |
1328 MUE_RFE_CTL_UNICAST | MUE_RFE_CTL_MULTICAST); 1328 MUE_RFE_CTL_UNICAST | MUE_RFE_CTL_MULTICAST);
1329 1329
1330 /* Always accept broadcast frames. */ 1330 /* Always accept broadcast frames. */
1331 rxfilt |= MUE_RFE_CTL_BROADCAST; 1331 rxfilt |= MUE_RFE_CTL_BROADCAST;
1332 1332
1333 if (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) { 1333 if (ifp->if_flags & IFF_PROMISC) {
1334allmulti: ifp->if_flags |= IFF_ALLMULTI; 1334 rxfilt |= MUE_RFE_CTL_UNICAST;
1335 rxfilt |= MUE_RFE_CTL_MULTICAST; 1335allmulti: rxfilt |= MUE_RFE_CTL_MULTICAST;
 1336 ifp->if_flags |= IFF_ALLMULTI;
1336 if (ifp->if_flags & IFF_PROMISC) { 1337 if (ifp->if_flags & IFF_PROMISC) {
1337 rxfilt |= MUE_RFE_CTL_UNICAST; 
1338 DPRINTF(sc, "promisc\n"); 1338 DPRINTF(sc, "promisc\n");
1339 } else { 1339 } else {
1340 DPRINTF(sc, "allmulti\n"); 1340 DPRINTF(sc, "allmulti\n");
1341 } 1341 }
1342 } else { 1342 } else {
1343 /* Now program new ones. */ 1343 /* Now program new ones. */
1344 pfiltbl[0][0] = MUE_ENADDR_HI(enaddr) | MUE_ADDR_FILTX_VALID; 1344 pfiltbl[0][0] = MUE_ENADDR_HI(enaddr) | MUE_ADDR_FILTX_VALID;
1345 pfiltbl[0][1] = MUE_ENADDR_LO(enaddr); 1345 pfiltbl[0][1] = MUE_ENADDR_LO(enaddr);
1346 i = 1; 1346 i = 1;
1347 ETHER_FIRST_MULTI(step, &sc->mue_ec, enm); 1347 ETHER_FIRST_MULTI(step, &sc->mue_ec, enm);
1348 while (enm != NULL) { 1348 while (enm != NULL) {
1349 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 1349 if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
1350 ETHER_ADDR_LEN)) { 1350 ETHER_ADDR_LEN)) {
@@ -1359,26 +1359,27 @@ allmulti: ifp->if_flags |= IFF_ALLMULTI; @@ -1359,26 +1359,27 @@ allmulti: ifp->if_flags |= IFF_ALLMULTI;
1359 MUE_ADDR_FILTX_VALID; 1359 MUE_ADDR_FILTX_VALID;
1360 pfiltbl[i][1] = MUE_ENADDR_LO(enm->enm_addrlo); 1360 pfiltbl[i][1] = MUE_ENADDR_LO(enm->enm_addrlo);
1361 } else { 1361 } else {
1362 /* Otherwise, use hash table. */ 1362 /* Otherwise, use hash table. */
1363 rxfilt |= MUE_RFE_CTL_MULTICAST_HASH; 1363 rxfilt |= MUE_RFE_CTL_MULTICAST_HASH;
1364 h = (ether_crc32_be(enm->enm_addrlo, 1364 h = (ether_crc32_be(enm->enm_addrlo,
1365 ETHER_ADDR_LEN) >> 23) & 0x1ff; 1365 ETHER_ADDR_LEN) >> 23) & 0x1ff;
1366 hashtbl[h / 32] |= 1 << (h % 32);  1366 hashtbl[h / 32] |= 1 << (h % 32);
1367 } 1367 }
1368 i++; 1368 i++;
1369 ETHER_NEXT_MULTI(step, enm); 1369 ETHER_NEXT_MULTI(step, enm);
1370 } 1370 }
1371 rxfilt |= MUE_RFE_CTL_PERFECT; 1371 rxfilt |= MUE_RFE_CTL_PERFECT;
 1372 ifp->if_flags &= ~IFF_ALLMULTI;
1372 if (rxfilt & MUE_RFE_CTL_MULTICAST_HASH) { 1373 if (rxfilt & MUE_RFE_CTL_MULTICAST_HASH) {
1373 DPRINTF(sc, "perfect filter and hash tables\n"); 1374 DPRINTF(sc, "perfect filter and hash tables\n");
1374 } else { 1375 } else {
1375 DPRINTF(sc, "perfect filter\n"); 1376 DPRINTF(sc, "perfect filter\n");
1376 } 1377 }
1377 } 1378 }
1378 1379
1379 for (i = 0; i < MUE_NUM_ADDR_FILTX; i++) { 1380 for (i = 0; i < MUE_NUM_ADDR_FILTX; i++) {
1380 hireg = (sc->mue_flags & LAN7500) ? 1381 hireg = (sc->mue_flags & LAN7500) ?
1381 MUE_7500_ADDR_FILTX(i) : MUE_7800_ADDR_FILTX(i); 1382 MUE_7500_ADDR_FILTX(i) : MUE_7800_ADDR_FILTX(i);
1382 loreg = hireg + 4; 1383 loreg = hireg + 4;
1383 mue_csr_write(sc, hireg, 0); 1384 mue_csr_write(sc, hireg, 0);
1384 mue_csr_write(sc, loreg, pfiltbl[i][1]); 1385 mue_csr_write(sc, loreg, pfiltbl[i][1]);