igb: fix recent VLAN changes that would leave VLANs disabled after reset
authorAlexander Duyck <alexander.h.duyck@intel.com>
Fri, 26 Aug 2011 07:46:08 +0000 (07:46 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 8 Oct 2011 05:50:57 +0000 (22:50 -0700)
This patch cleans up several issues with VLANs on igb after the recent
changes that were meant to leave the VLANs enabled/disable via the
netdev->features flags.

Specifically the Rx VLAN settings were being dropped after reset due to the
fact that they were not being restored correctly.  In addition I removed
the IRQ disable/enable since those were in place to protect the setting of
vlgrp.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/igb/igb_main.c

index 1419ae8..971aea9 100644 (file)
@@ -2112,8 +2112,6 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        if (err)
                goto err_register;
 
-       igb_vlan_mode(netdev, netdev->features);
-
        /* carrier off reporting is important to ethtool even BEFORE open */
        netif_carrier_off(netdev);
 
@@ -5120,7 +5118,6 @@ static s32 igb_vlvf_set(struct igb_adapter *adapter, u32 vid, bool add, u32 vf)
                        }
 
                        adapter->vf_data[vf].vlans_enabled++;
-                       return 0;
                }
        } else {
                if (i < E1000_VLVF_ARRAY_SIZE) {
@@ -6385,10 +6382,9 @@ static void igb_vlan_mode(struct net_device *netdev, u32 features)
        struct igb_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
        u32 ctrl, rctl;
+       bool enable = !!(features & NETIF_F_HW_VLAN_RX);
 
-       igb_irq_disable(adapter);
-
-       if (features & NETIF_F_HW_VLAN_RX) {
+       if (enable) {
                /* enable VLAN tag insert/strip */
                ctrl = rd32(E1000_CTRL);
                ctrl |= E1000_CTRL_VME;
@@ -6406,9 +6402,6 @@ static void igb_vlan_mode(struct net_device *netdev, u32 features)
        }
 
        igb_rlpml_set(adapter);
-
-       if (!test_bit(__IGB_DOWN, &adapter->state))
-               igb_irq_enable(adapter);
 }
 
 static void igb_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
@@ -6433,11 +6426,6 @@ static void igb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
        int pf_id = adapter->vfs_allocated_count;
        s32 err;
 
-       igb_irq_disable(adapter);
-
-       if (!test_bit(__IGB_DOWN, &adapter->state))
-               igb_irq_enable(adapter);
-
        /* remove vlan from VLVF table array */
        err = igb_vlvf_set(adapter, vid, false, pf_id);
 
@@ -6452,6 +6440,8 @@ static void igb_restore_vlan(struct igb_adapter *adapter)
 {
        u16 vid;
 
+       igb_vlan_mode(adapter->netdev, adapter->netdev->features);
+
        for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID)
                igb_vlan_rx_add_vid(adapter->netdev, vid);
 }