ixgbe: fix tag stripping for VLAN ID 0
Register VLAN ID 0 so that frames with VLAN ID 0 are received and get their tag stripped when ixgbe is not in DCB mode. VLAN ID 0 means that the frame is 'priority tagged' only - it is not a VLAN, but the priority value is the tag in valid. The functions ixgbe_vlan_rx_register() and ixgbe_vlan_rx_kill_vid() were moved up a couple functions to correct compiling issues with this change. Signed-off-by: Don Skidmore <donald.c.skidmore@intel.com> Signed-off-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com> Signed-off-by: Eric W Multanen <eric.w.multanen@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
15005a3204
commit
068c89b014
@@ -1744,38 +1744,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
|||||||
IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
|
IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ixgbe_vlan_rx_register(struct net_device *netdev,
|
|
||||||
struct vlan_group *grp)
|
|
||||||
{
|
|
||||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
||||||
u32 ctrl;
|
|
||||||
|
|
||||||
if (!test_bit(__IXGBE_DOWN, &adapter->state))
|
|
||||||
ixgbe_irq_disable(adapter);
|
|
||||||
adapter->vlgrp = grp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* For a DCB driver, always enable VLAN tag stripping so we can
|
|
||||||
* still receive traffic from a DCB-enabled host even if we're
|
|
||||||
* not in DCB mode.
|
|
||||||
*/
|
|
||||||
ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL);
|
|
||||||
ctrl |= IXGBE_VLNCTRL_VME;
|
|
||||||
ctrl &= ~IXGBE_VLNCTRL_CFIEN;
|
|
||||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl);
|
|
||||||
|
|
||||||
if (grp) {
|
|
||||||
/* enable VLAN tag insert/strip */
|
|
||||||
ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL);
|
|
||||||
ctrl |= IXGBE_VLNCTRL_VME;
|
|
||||||
ctrl &= ~IXGBE_VLNCTRL_CFIEN;
|
|
||||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!test_bit(__IXGBE_DOWN, &adapter->state))
|
|
||||||
ixgbe_irq_enable(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
|
static void ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
|
||||||
{
|
{
|
||||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||||
@@ -1802,6 +1770,39 @@ static void ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
|
|||||||
hw->mac.ops.set_vfta(&adapter->hw, vid, 0, false);
|
hw->mac.ops.set_vfta(&adapter->hw, vid, 0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ixgbe_vlan_rx_register(struct net_device *netdev,
|
||||||
|
struct vlan_group *grp)
|
||||||
|
{
|
||||||
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||||
|
u32 ctrl;
|
||||||
|
|
||||||
|
if (!test_bit(__IXGBE_DOWN, &adapter->state))
|
||||||
|
ixgbe_irq_disable(adapter);
|
||||||
|
adapter->vlgrp = grp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For a DCB driver, always enable VLAN tag stripping so we can
|
||||||
|
* still receive traffic from a DCB-enabled host even if we're
|
||||||
|
* not in DCB mode.
|
||||||
|
*/
|
||||||
|
ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL);
|
||||||
|
ctrl |= IXGBE_VLNCTRL_VME;
|
||||||
|
ctrl &= ~IXGBE_VLNCTRL_CFIEN;
|
||||||
|
IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl);
|
||||||
|
ixgbe_vlan_rx_add_vid(netdev, 0);
|
||||||
|
|
||||||
|
if (grp) {
|
||||||
|
/* enable VLAN tag insert/strip */
|
||||||
|
ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL);
|
||||||
|
ctrl |= IXGBE_VLNCTRL_VME;
|
||||||
|
ctrl &= ~IXGBE_VLNCTRL_CFIEN;
|
||||||
|
IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!test_bit(__IXGBE_DOWN, &adapter->state))
|
||||||
|
ixgbe_irq_enable(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
static void ixgbe_restore_vlan(struct ixgbe_adapter *adapter)
|
static void ixgbe_restore_vlan(struct ixgbe_adapter *adapter)
|
||||||
{
|
{
|
||||||
ixgbe_vlan_rx_register(adapter->netdev, adapter->vlgrp);
|
ixgbe_vlan_rx_register(adapter->netdev, adapter->vlgrp);
|
||||||
|
Reference in New Issue
Block a user