]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: stmmac: xgmac: Fix VLAN register handling
authorJose Abreu <Jose.Abreu@synopsys.com>
Thu, 2 Apr 2020 13:57:07 +0000 (15:57 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 21 Apr 2020 07:06:34 +0000 (09:06 +0200)
commit 21f64e72e7073199a6f8d7d8efe52cd814d7d665 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c

index e9bf54a579df6f5e9c2efca5406c41631a940ef4..f0b9c43f6e31e9a56b6c68e0a8d6d58ef59a1a4f 100644 (file)
@@ -576,8 +576,13 @@ static void dwxgmac2_update_vlan_hash(struct mac_device_info *hw, u32 hash,
                        value |= XGMAC_VLAN_EDVLP;
                        value |= XGMAC_VLAN_ESVL;
                        value |= XGMAC_VLAN_DOVLTC;
+               } else {
+                       value &= ~XGMAC_VLAN_EDVLP;
+                       value &= ~XGMAC_VLAN_ESVL;
+                       value &= ~XGMAC_VLAN_DOVLTC;
                }
 
+               value &= ~XGMAC_VLAN_VID;
                writel(value, ioaddr + XGMAC_VLAN_TAG);
        } else if (perfect_match) {
                u32 value = readl(ioaddr + XGMAC_PACKET_FILTER);
@@ -588,13 +593,19 @@ static void dwxgmac2_update_vlan_hash(struct mac_device_info *hw, u32 hash,
 
                value = readl(ioaddr + XGMAC_VLAN_TAG);
 
+               value &= ~XGMAC_VLAN_VTHM;
                value |= XGMAC_VLAN_ETV;
                if (is_double) {
                        value |= XGMAC_VLAN_EDVLP;
                        value |= XGMAC_VLAN_ESVL;
                        value |= XGMAC_VLAN_DOVLTC;
+               } else {
+                       value &= ~XGMAC_VLAN_EDVLP;
+                       value &= ~XGMAC_VLAN_ESVL;
+                       value &= ~XGMAC_VLAN_DOVLTC;
                }
 
+               value &= ~XGMAC_VLAN_VID;
                writel(value | perfect_match, ioaddr + XGMAC_VLAN_TAG);
        } else {
                u32 value = readl(ioaddr + XGMAC_PACKET_FILTER);