|
@@ -1744,6 +1744,32 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
|
|
|
}
|
|
|
|
|
|
+static void ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
+ struct ixgbe_hw *hw = &adapter->hw;
|
|
|
+
|
|
|
+ /* add VID to filter table */
|
|
|
+ hw->mac.ops.set_vfta(&adapter->hw, vid, 0, true);
|
|
|
+}
|
|
|
+
|
|
|
+static void ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
+ struct ixgbe_hw *hw = &adapter->hw;
|
|
|
+
|
|
|
+ if (!test_bit(__IXGBE_DOWN, &adapter->state))
|
|
|
+ ixgbe_irq_disable(adapter);
|
|
|
+
|
|
|
+ vlan_group_set_device(adapter->vlgrp, vid, NULL);
|
|
|
+
|
|
|
+ if (!test_bit(__IXGBE_DOWN, &adapter->state))
|
|
|
+ ixgbe_irq_enable(adapter);
|
|
|
+
|
|
|
+ /* remove VID from filter table */
|
|
|
+ hw->mac.ops.set_vfta(&adapter->hw, vid, 0, false);
|
|
|
+}
|
|
|
+
|
|
|
static void ixgbe_vlan_rx_register(struct net_device *netdev,
|
|
|
struct vlan_group *grp)
|
|
|
{
|
|
@@ -1763,6 +1789,7 @@ static void ixgbe_vlan_rx_register(struct net_device *netdev,
|
|
|
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 */
|
|
@@ -1776,32 +1803,6 @@ static void ixgbe_vlan_rx_register(struct net_device *netdev,
|
|
|
ixgbe_irq_enable(adapter);
|
|
|
}
|
|
|
|
|
|
-static void ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
|
|
|
-{
|
|
|
- struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
- struct ixgbe_hw *hw = &adapter->hw;
|
|
|
-
|
|
|
- /* add VID to filter table */
|
|
|
- hw->mac.ops.set_vfta(&adapter->hw, vid, 0, true);
|
|
|
-}
|
|
|
-
|
|
|
-static void ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
|
|
|
-{
|
|
|
- struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
- struct ixgbe_hw *hw = &adapter->hw;
|
|
|
-
|
|
|
- if (!test_bit(__IXGBE_DOWN, &adapter->state))
|
|
|
- ixgbe_irq_disable(adapter);
|
|
|
-
|
|
|
- vlan_group_set_device(adapter->vlgrp, vid, NULL);
|
|
|
-
|
|
|
- if (!test_bit(__IXGBE_DOWN, &adapter->state))
|
|
|
- ixgbe_irq_enable(adapter);
|
|
|
-
|
|
|
- /* remove VID from filter table */
|
|
|
- hw->mac.ops.set_vfta(&adapter->hw, vid, 0, false);
|
|
|
-}
|
|
|
-
|
|
|
static void ixgbe_restore_vlan(struct ixgbe_adapter *adapter)
|
|
|
{
|
|
|
ixgbe_vlan_rx_register(adapter->netdev, adapter->vlgrp);
|