net: stmmac: dwmac4: Always update the MAC Hash Filter
We need to always update the MAC Hash Filter so that previous entries are invalidated. Found out while running stmmac selftests. Fixes: b8ef7020d6e5 ("net: stmmac: add support for hash table size 128/256 in dwmac4") Signed-off-by: Jose Abreu <Jose.Abreu@synopsys.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
432439fef9
commit
f79bfda375
@ -401,8 +401,11 @@ static void dwmac4_set_filter(struct mac_device_info *hw,
|
|||||||
int numhashregs = (hw->multicast_filter_bins >> 5);
|
int numhashregs = (hw->multicast_filter_bins >> 5);
|
||||||
int mcbitslog2 = hw->mcast_bits_log2;
|
int mcbitslog2 = hw->mcast_bits_log2;
|
||||||
unsigned int value;
|
unsigned int value;
|
||||||
|
u32 mc_filter[8];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
memset(mc_filter, 0, sizeof(mc_filter));
|
||||||
|
|
||||||
value = readl(ioaddr + GMAC_PACKET_FILTER);
|
value = readl(ioaddr + GMAC_PACKET_FILTER);
|
||||||
value &= ~GMAC_PACKET_FILTER_HMC;
|
value &= ~GMAC_PACKET_FILTER_HMC;
|
||||||
value &= ~GMAC_PACKET_FILTER_HPF;
|
value &= ~GMAC_PACKET_FILTER_HPF;
|
||||||
@ -416,16 +419,13 @@ static void dwmac4_set_filter(struct mac_device_info *hw,
|
|||||||
/* Pass all multi */
|
/* Pass all multi */
|
||||||
value |= GMAC_PACKET_FILTER_PM;
|
value |= GMAC_PACKET_FILTER_PM;
|
||||||
/* Set all the bits of the HASH tab */
|
/* Set all the bits of the HASH tab */
|
||||||
for (i = 0; i < numhashregs; i++)
|
memset(mc_filter, 0xff, sizeof(mc_filter));
|
||||||
writel(0xffffffff, ioaddr + GMAC_HASH_TAB(i));
|
|
||||||
} else if (!netdev_mc_empty(dev)) {
|
} else if (!netdev_mc_empty(dev)) {
|
||||||
struct netdev_hw_addr *ha;
|
struct netdev_hw_addr *ha;
|
||||||
u32 mc_filter[8];
|
|
||||||
|
|
||||||
/* Hash filter for multicast */
|
/* Hash filter for multicast */
|
||||||
value |= GMAC_PACKET_FILTER_HMC;
|
value |= GMAC_PACKET_FILTER_HMC;
|
||||||
|
|
||||||
memset(mc_filter, 0, sizeof(mc_filter));
|
|
||||||
netdev_for_each_mc_addr(ha, dev) {
|
netdev_for_each_mc_addr(ha, dev) {
|
||||||
/* The upper n bits of the calculated CRC are used to
|
/* The upper n bits of the calculated CRC are used to
|
||||||
* index the contents of the hash table. The number of
|
* index the contents of the hash table. The number of
|
||||||
@ -440,10 +440,11 @@ static void dwmac4_set_filter(struct mac_device_info *hw,
|
|||||||
*/
|
*/
|
||||||
mc_filter[bit_nr >> 5] |= (1 << (bit_nr & 0x1f));
|
mc_filter[bit_nr >> 5] |= (1 << (bit_nr & 0x1f));
|
||||||
}
|
}
|
||||||
for (i = 0; i < numhashregs; i++)
|
|
||||||
writel(mc_filter[i], ioaddr + GMAC_HASH_TAB(i));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < numhashregs; i++)
|
||||||
|
writel(mc_filter[i], ioaddr + GMAC_HASH_TAB(i));
|
||||||
|
|
||||||
value |= GMAC_PACKET_FILTER_HPF;
|
value |= GMAC_PACKET_FILTER_HPF;
|
||||||
|
|
||||||
/* Handle multiple unicast addresses */
|
/* Handle multiple unicast addresses */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user