Currently VLAN filtering is enabled when the first VLAN is added.
Obviously before that there's no point in receiving any VLAN packets.
Now that we disable VLAN filtering in promiscous mode, we can keep
the VLAN filters enabled the remaining time.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Acked-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
                } else {
                        rctl &= ~E1000_RCTL_MPE;
                }
-               if (adapter->vlgrp && adapter->hw.mac_type != e1000_ich8lan)
+               if (adapter->hw.mac_type != e1000_ich8lan)
                        rctl |= E1000_RCTL_VFE;
        }
 
                if (adapter->hw.mac_type != e1000_ich8lan) {
                        /* enable VLAN receive filtering */
                        rctl = E1000_READ_REG(&adapter->hw, RCTL);
-                       if (!(netdev->flags & IFF_PROMISC))
-                               rctl |= E1000_RCTL_VFE;
                        rctl &= ~E1000_RCTL_CFIEN;
                        E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
                        e1000_update_mng_vlan(adapter);
                E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
 
                if (adapter->hw.mac_type != e1000_ich8lan) {
-                       /* disable VLAN filtering */
-                       rctl = E1000_READ_REG(&adapter->hw, RCTL);
-                       rctl &= ~E1000_RCTL_VFE;
-                       E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
                        if (adapter->mng_vlan_id !=
                            (u16)E1000_MNG_VLAN_NONE) {
                                e1000_vlan_rx_kill_vid(netdev,
 
                if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
                        /* enable VLAN receive filtering */
                        rctl = er32(RCTL);
-                       if (!(netdev->flags & IFF_PROMISC))
-                               rctl |= E1000_RCTL_VFE;
                        rctl &= ~E1000_RCTL_CFIEN;
                        ew32(RCTL, rctl);
                        e1000_update_mng_vlan(adapter);
                ew32(CTRL, ctrl);
 
                if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
-                       /* disable VLAN filtering */
-                       rctl = er32(RCTL);
-                       rctl &= ~E1000_RCTL_VFE;
-                       ew32(RCTL, rctl);
                        if (adapter->mng_vlan_id !=
                            (u16)E1000_MNG_VLAN_NONE) {
                                e1000_vlan_rx_kill_vid(netdev,
                } else {
                        rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
                }
-               if (adapter->vlgrp && adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
+               if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
                        rctl |= E1000_RCTL_VFE;
        }
 
 
                        rctl &= ~E1000_RCTL_UPE;
                } else
                        rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
-               if (adapter->vlgrp)
-                       rctl |= E1000_RCTL_VFE;
+               rctl |= E1000_RCTL_VFE;
        }
        wr32(E1000_RCTL, rctl);
 
 
                /* enable VLAN receive filtering */
                rctl = rd32(E1000_RCTL);
-               if (!(netdev->flags & IFF_PROMISC))
-                       rctl |= E1000_RCTL_VFE;
                rctl &= ~E1000_RCTL_CFIEN;
                wr32(E1000_RCTL, rctl);
                igb_update_mng_vlan(adapter);
                ctrl &= ~E1000_CTRL_VME;
                wr32(E1000_CTRL, ctrl);
 
-               /* disable VLAN filtering */
-               rctl = rd32(E1000_RCTL);
-               rctl &= ~E1000_RCTL_VFE;
-               wr32(E1000_RCTL, rctl);
                if (adapter->mng_vlan_id != (u16)IGB_MNG_VLAN_NONE) {
                        igb_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
                        adapter->mng_vlan_id = IGB_MNG_VLAN_NONE;
 
                } else {
                        rctl &= ~(IXGB_RCTL_UPE | IXGB_RCTL_MPE);
                }
-               if (adapter->vlgrp)
-                       rctl |= IXGB_RCTL_VFE;
+               rctl |= IXGB_RCTL_VFE;
        }
 
        if (netdev->mc_count > IXGB_MAX_NUM_MULTICAST_ADDRESSES) {
                /* enable VLAN receive filtering */
 
                rctl = IXGB_READ_REG(&adapter->hw, RCTL);
-               if (!(netdev->flags & IFF_PROMISC))
-                       rctl |= IXGB_RCTL_VFE;
                rctl &= ~IXGB_RCTL_CFIEN;
                IXGB_WRITE_REG(&adapter->hw, RCTL, rctl);
        } else {
                ctrl = IXGB_READ_REG(&adapter->hw, CTRL0);
                ctrl &= ~IXGB_CTRL0_VME;
                IXGB_WRITE_REG(&adapter->hw, CTRL0, ctrl);
-
-               /* disable VLAN filtering */
-
-               rctl = IXGB_READ_REG(&adapter->hw, RCTL);
-               rctl &= ~IXGB_RCTL_VFE;
-               IXGB_WRITE_REG(&adapter->hw, RCTL, rctl);
        }
 
        /* don't enable interrupts unless we are UP */
 
                /* enable VLAN tag insert/strip */
                ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL);
                ctrl |= IXGBE_VLNCTRL_VME;
-               if (!(netdev->flags & IFF_PROMISC))
-                       ctrl |= IXGBE_VLNCTRL_VFE;
                ctrl &= ~IXGBE_VLNCTRL_CFIEN;
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl);
        }
                } else {
                        fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
                }
-               if (adapter->vlgrp)
-                       fctrl |= IXGBE_VLNCTRL_VFE;
+               fctrl |= IXGBE_VLNCTRL_VFE;
        }
 
        IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);