| @@ -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) { |
1334 | allmulti: ifp->if_flags |= IFF_ALLMULTI; | | 1334 | rxfilt |= MUE_RFE_CTL_UNICAST; |
1335 | rxfilt |= MUE_RFE_CTL_MULTICAST; | | 1335 | allmulti: 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]); |