Page MenuHomeFreeBSD

D6653.id17142.diff
No OneTemporary

D6653.id17142.diff

Index: sys/dev/dwc/if_dwc.c
===================================================================
--- sys/dev/dwc/if_dwc.c
+++ sys/dev/dwc/if_dwc.c
@@ -587,19 +587,26 @@
struct ifmultiaddr *ifma;
struct ifnet *ifp;
uint8_t *eaddr, val;
- uint32_t crc, ffval, hashbit, hashreg, hi, lo, reg;
+ uint32_t crc, ffval, hashbit, hashreg, hi, lo, hash[8], hmask;
+ int nhash, i;
DWC_ASSERT_LOCKED(sc);
ifp = sc->ifp;
+ nhash = sc->mactype == DWC_GMAC_ALT_DESC ? 2 : 8;
+ hmask = ((nhash << 5) - 1) | 0xf;
/*
* Set the multicast (group) filter hash.
*/
- if ((ifp->if_flags & IFF_ALLMULTI))
+ if ((ifp->if_flags & IFF_ALLMULTI) != 0) {
ffval = (FRAME_FILTER_PM);
- else {
+ for (i = 0; i < nhash; i++)
+ hash[i] = ~0;
+ } else {
ffval = (FRAME_FILTER_HMC);
+ for (i = 0; i < nhash; i++)
+ hash[i] = 0;
if_maddr_rlock(ifp);
TAILQ_FOREACH(ifma, &sc->ifp->if_multiaddrs, ifma_link) {
if (ifma->ifma_addr->sa_family != AF_LINK)
@@ -608,13 +615,13 @@
ifma->ifma_addr), ETHER_ADDR_LEN);
/* Take lower 8 bits and reverse it */
- val = bitreverse(~crc & 0xff);
- hashreg = (val >> 5);
+ val = bitreverse(~crc & 0xff) & hmask;
+ if (sc->mactype == DWC_GMAC_ALT_DESC)
+ hashreg = (val >> 5) == 0;
+ else
+ hashreg = (val >> 5);
hashbit = (val & 31);
-
- reg = READ4(sc, HASH_TABLE_REG(hashreg));
- reg |= (1 << hashbit);
- WRITE4(sc, HASH_TABLE_REG(hashreg), reg);
+ hash[hashreg] |= (1 << hashbit);
}
if_maddr_runlock(ifp);
}
@@ -635,6 +642,8 @@
WRITE4(sc, MAC_ADDRESS_LOW(0), lo);
WRITE4(sc, MAC_ADDRESS_HIGH(0), hi);
WRITE4(sc, MAC_FRAME_FILTER, ffval);
+ for (i = 0; i < nhash; i++)
+ WRITE4(sc, HASH_TABLE_REG(i), hash[i]);
}
static int

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 2, 4:06 AM (1 h, 49 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30702737
Default Alt Text
D6653.id17142.diff (1 KB)

Event Timeline