diff options
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_vlan.c | 15 |
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); } |
