Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: stmmac: xgmac: Fix VLAN register handling

Commit 907a076881f1, forgot that we need to clear old values of
XGMAC_VLAN_TAG register when we switch from VLAN perfect matching to
HASH matching.

Fix it.

Fixes: 907a076881f1 ("net: stmmac: xgmac: fix incorrect XGMAC_VLAN_TAG register writting")
Signed-off-by: Jose Abreu <Jose.Abreu@synopsys.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jose Abreu and committed by
David S. Miller
21f64e72 a7d40cbb

+11
+11
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c
··· 577 577 value |= XGMAC_VLAN_EDVLP; 578 578 value |= XGMAC_VLAN_ESVL; 579 579 value |= XGMAC_VLAN_DOVLTC; 580 + } else { 581 + value &= ~XGMAC_VLAN_EDVLP; 582 + value &= ~XGMAC_VLAN_ESVL; 583 + value &= ~XGMAC_VLAN_DOVLTC; 580 584 } 581 585 586 + value &= ~XGMAC_VLAN_VID; 582 587 writel(value, ioaddr + XGMAC_VLAN_TAG); 583 588 } else if (perfect_match) { 584 589 u32 value = readl(ioaddr + XGMAC_PACKET_FILTER); ··· 594 589 595 590 value = readl(ioaddr + XGMAC_VLAN_TAG); 596 591 592 + value &= ~XGMAC_VLAN_VTHM; 597 593 value |= XGMAC_VLAN_ETV; 598 594 if (is_double) { 599 595 value |= XGMAC_VLAN_EDVLP; 600 596 value |= XGMAC_VLAN_ESVL; 601 597 value |= XGMAC_VLAN_DOVLTC; 598 + } else { 599 + value &= ~XGMAC_VLAN_EDVLP; 600 + value &= ~XGMAC_VLAN_ESVL; 601 + value &= ~XGMAC_VLAN_DOVLTC; 602 602 } 603 603 604 + value &= ~XGMAC_VLAN_VID; 604 605 writel(value | perfect_match, ioaddr + XGMAC_VLAN_TAG); 605 606 } else { 606 607 u32 value = readl(ioaddr + XGMAC_PACKET_FILTER);