summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_vlan.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_vlan.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_vlan.c
index 1550843446a7..7f1e34e62eee 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_vlan.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_vlan.c
@@ -13,6 +13,8 @@ static void vlan_write_single(struct net_device *dev, u32 data)
u32 val, mask;
mask = VLAN_TAG_ERSVLM | VLAN_TAG_VID;
+ if (!(data & VLAN_TAG_VID))
+ data |= VLAN_TAG_VID;
val = readl(ioaddr + VLAN_TAG) & ~mask;
val |= VLAN_TAG_ETV | (data & mask);
@@ -209,6 +211,9 @@ static void vlan_update_hash(struct mac_device_info *hw, u32 hash,
value &= ~VLAN_DOVLTC;
}
+ if (!hw->vlan_filter[0])
+ value |= VLAN_VID;
+
writel(value, ioaddr + VLAN_TAG);
} else if (perfect_match) {
u32 value = VLAN_ETV;
@@ -228,7 +233,8 @@ static void vlan_update_hash(struct mac_device_info *hw, u32 hash,
value &= ~(VLAN_VTHM | VLAN_ETV);
value &= ~(VLAN_EDVLP | VLAN_ESVL);
value &= ~VLAN_DOVLTC;
- value &= ~VLAN_VID;
+ if (!hw->vlan_filter[0])
+ value |= VLAN_VID;
writel(value, ioaddr + VLAN_TAG);
}
@@ -298,7 +304,9 @@ static void dwxgmac2_update_vlan_hash(struct mac_device_info *hw, u32 hash,
value &= ~VLAN_DOVLTC;
}
- value &= ~VLAN_VID;
+ if (!hw->vlan_filter[0])
+ value |= VLAN_VID;
+
writel(value, ioaddr + VLAN_TAG);
} else if (perfect_match) {
value &= ~VLAN_VTHM;
@@ -319,7 +327,8 @@ static void dwxgmac2_update_vlan_hash(struct mac_device_info *hw, u32 hash,
value &= ~(VLAN_VTHM | VLAN_ETV);
value &= ~(VLAN_EDVLP | VLAN_ESVL);
value &= ~VLAN_DOVLTC;
- value &= ~VLAN_VID;
+ if (!hw->vlan_filter[0])
+ value |= VLAN_VID;
writel(value, ioaddr + VLAN_TAG);
}