drivers/net: request_irq - Remove unnecessary leading & from second arg
[deliverable/linux.git] / drivers / net / igb / igb_main.c
index 24a119ec005d13bdff3ae65d8308692d3cd78226..958305e92d679e3354d366c7d2a3dcaa91b422ab 100644 (file)
@@ -91,8 +91,6 @@ static int igb_open(struct net_device *);
 static int igb_close(struct net_device *);
 static void igb_configure_tx(struct igb_adapter *);
 static void igb_configure_rx(struct igb_adapter *);
-static void igb_setup_tctl(struct igb_adapter *);
-static void igb_setup_rctl(struct igb_adapter *);
 static void igb_clean_all_tx_rings(struct igb_adapter *);
 static void igb_clean_all_rx_rings(struct igb_adapter *);
 static void igb_clean_tx_ring(struct igb_ring *);
@@ -101,10 +99,7 @@ static void igb_set_rx_mode(struct net_device *);
 static void igb_update_phy_info(unsigned long);
 static void igb_watchdog(unsigned long);
 static void igb_watchdog_task(struct work_struct *);
-static netdev_tx_t igb_xmit_frame_ring_adv(struct sk_buff *,
-                                          struct igb_ring *);
-static netdev_tx_t igb_xmit_frame_adv(struct sk_buff *skb,
-                                     struct net_device *);
+static netdev_tx_t igb_xmit_frame_adv(struct sk_buff *skb, struct net_device *);
 static struct net_device_stats *igb_get_stats(struct net_device *);
 static int igb_change_mtu(struct net_device *, int);
 static int igb_set_mac(struct net_device *, void *);
@@ -120,7 +115,6 @@ static void igb_setup_dca(struct igb_adapter *);
 static bool igb_clean_tx_irq(struct igb_q_vector *);
 static int igb_poll(struct napi_struct *, int);
 static bool igb_clean_rx_irq_adv(struct igb_q_vector *, int *, int);
-static void igb_alloc_rx_buffers_adv(struct igb_ring *, int);
 static int igb_ioctl(struct net_device *, struct ifreq *, int cmd);
 static void igb_tx_timeout(struct net_device *);
 static void igb_reset_task(struct work_struct *);
@@ -131,43 +125,10 @@ static void igb_restore_vlan(struct igb_adapter *);
 static void igb_rar_set_qsel(struct igb_adapter *, u8 *, u32 , u8);
 static void igb_ping_all_vfs(struct igb_adapter *);
 static void igb_msg_task(struct igb_adapter *);
-static int igb_rcv_msg_from_vf(struct igb_adapter *, u32);
 static void igb_vmm_control(struct igb_adapter *);
-static int igb_set_vf_mac(struct igb_adapter *adapter, int, unsigned char *);
+static int igb_set_vf_mac(struct igb_adapter *, int, unsigned char *);
 static void igb_restore_vf_multicasts(struct igb_adapter *adapter);
 
-static inline void igb_set_vmolr(struct e1000_hw *hw, int vfn)
-{
-       u32 reg_data;
-
-       reg_data = rd32(E1000_VMOLR(vfn));
-       reg_data |= E1000_VMOLR_BAM |    /* Accept broadcast */
-                   E1000_VMOLR_ROMPE |  /* Accept packets matched in MTA */
-                   E1000_VMOLR_AUPE |   /* Accept untagged packets */
-                   E1000_VMOLR_STRVLAN; /* Strip vlan tags */
-       wr32(E1000_VMOLR(vfn), reg_data);
-}
-
-static inline int igb_set_vf_rlpml(struct igb_adapter *adapter, int size,
-                                 int vfn)
-{
-       struct e1000_hw *hw = &adapter->hw;
-       u32 vmolr;
-
-       /* if it isn't the PF check to see if VFs are enabled and
-        * increase the size to support vlan tags */
-       if (vfn < adapter->vfs_allocated_count &&
-           adapter->vf_data[vfn].vlans_enabled)
-               size += VLAN_TAG_SIZE;
-
-       vmolr = rd32(E1000_VMOLR(vfn));
-       vmolr &= ~E1000_VMOLR_RLPML_MASK;
-       vmolr |= size | E1000_VMOLR_LPE;
-       wr32(E1000_VMOLR(vfn), vmolr);
-
-       return 0;
-}
-
 #ifdef CONFIG_PM
 static int igb_suspend(struct pci_dev *, pm_message_t);
 static int igb_resume(struct pci_dev *);
@@ -218,45 +179,11 @@ static struct pci_driver igb_driver = {
        .err_handler = &igb_err_handler
 };
 
-static int global_quad_port_a; /* global quad port a indication */
-
 MODULE_AUTHOR("Intel Corporation, <e1000-devel@lists.sourceforge.net>");
 MODULE_DESCRIPTION("Intel(R) Gigabit Ethernet Network Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(DRV_VERSION);
 
-/**
- * Scale the NIC clock cycle by a large factor so that
- * relatively small clock corrections can be added or
- * substracted at each clock tick. The drawbacks of a
- * large factor are a) that the clock register overflows
- * more quickly (not such a big deal) and b) that the
- * increment per tick has to fit into 24 bits.
- *
- * Note that
- *   TIMINCA = IGB_TSYNC_CYCLE_TIME_IN_NANOSECONDS *
- *             IGB_TSYNC_SCALE
- *   TIMINCA += TIMINCA * adjustment [ppm] / 1e9
- *
- * The base scale factor is intentionally a power of two
- * so that the division in %struct timecounter can be done with
- * a shift.
- */
-#define IGB_TSYNC_SHIFT (19)
-#define IGB_TSYNC_SCALE (1<<IGB_TSYNC_SHIFT)
-
-/**
- * The duration of one clock cycle of the NIC.
- *
- * @todo This hard-coded value is part of the specification and might change
- * in future hardware revisions. Add revision check.
- */
-#define IGB_TSYNC_CYCLE_TIME_IN_NANOSECONDS 16
-
-#if (IGB_TSYNC_SCALE * IGB_TSYNC_CYCLE_TIME_IN_NANOSECONDS) >= (1<<24)
-# error IGB_TSYNC_SCALE and/or IGB_TSYNC_CYCLE_TIME_IN_NANOSECONDS are too large to fit into TIMINCA
-#endif
-
 /**
  * igb_read_clock - read raw cycle counter (to be used by time counter)
  */
@@ -265,11 +192,11 @@ static cycle_t igb_read_clock(const struct cyclecounter *tc)
        struct igb_adapter *adapter =
                container_of(tc, struct igb_adapter, cycles);
        struct e1000_hw *hw = &adapter->hw;
-       u64 stamp;
-
-       stamp =  rd32(E1000_SYSTIML);
-       stamp |= (u64)rd32(E1000_SYSTIMH) << 32ULL;
+       u64 stamp = 0;
+       int shift = 0;
 
+       stamp |= (u64)rd32(E1000_SYSTIML) << shift;
+       stamp |= (u64)rd32(E1000_SYSTIMH) << (shift + 32);
        return stamp;
 }
 
@@ -309,17 +236,6 @@ static char *igb_get_time_str(struct igb_adapter *adapter,
 }
 #endif
 
-/**
- * igb_desc_unused - calculate if we have unused descriptors
- **/
-static int igb_desc_unused(struct igb_ring *ring)
-{
-       if (ring->next_to_clean > ring->next_to_use)
-               return ring->next_to_clean - ring->next_to_use - 1;
-
-       return ring->count + ring->next_to_clean - ring->next_to_use - 1;
-}
-
 /**
  * igb_init_module - Driver Registration Routine
  *
@@ -334,12 +250,9 @@ static int __init igb_init_module(void)
 
        printk(KERN_INFO "%s\n", igb_copyright);
 
-       global_quad_port_a = 0;
-
 #ifdef CONFIG_IGB_DCA
        dca_register_notify(&dca_notifier);
 #endif
-
        ret = pci_register_driver(&igb_driver);
        return ret;
 }
@@ -372,7 +285,7 @@ module_exit(igb_exit_module);
  **/
 static void igb_cache_ring_register(struct igb_adapter *adapter)
 {
-       int i;
+       int i = 0, j = 0;
        u32 rbase_offset = adapter->vfs_allocated_count;
 
        switch (adapter->hw.mac.type) {
@@ -382,19 +295,20 @@ static void igb_cache_ring_register(struct igb_adapter *adapter)
                 * In order to avoid collision we start at the first free queue
                 * and continue consuming queues in the same sequence
                 */
-               for (i = 0; i < adapter->num_rx_queues; i++)
-                       adapter->rx_ring[i].reg_idx = rbase_offset +
-                                                     Q_IDX_82576(i);
-               for (i = 0; i < adapter->num_tx_queues; i++)
-                       adapter->tx_ring[i].reg_idx = rbase_offset +
-                                                     Q_IDX_82576(i);
-               break;
+               if (adapter->vfs_allocated_count) {
+                       for (; i < adapter->rss_queues; i++)
+                               adapter->rx_ring[i].reg_idx = rbase_offset +
+                                                             Q_IDX_82576(i);
+                       for (; j < adapter->rss_queues; j++)
+                               adapter->tx_ring[j].reg_idx = rbase_offset +
+                                                             Q_IDX_82576(j);
+               }
        case e1000_82575:
        default:
-               for (i = 0; i < adapter->num_rx_queues; i++)
-                       adapter->rx_ring[i].reg_idx = i;
-               for (i = 0; i < adapter->num_tx_queues; i++)
-                       adapter->tx_ring[i].reg_idx = i;
+               for (; i < adapter->num_rx_queues; i++)
+                       adapter->rx_ring[i].reg_idx = rbase_offset + i;
+               for (; j < adapter->num_tx_queues; j++)
+                       adapter->tx_ring[j].reg_idx = rbase_offset + j;
                break;
        }
 }
@@ -611,7 +525,7 @@ static int igb_request_msix(struct igb_adapter *adapter)
        int i, err = 0, vector = 0;
 
        err = request_irq(adapter->msix_entries[vector].vector,
-                         &igb_msix_other, 0, netdev->name, adapter);
+                         igb_msix_other, 0, netdev->name, adapter);
        if (err)
                goto out;
        vector++;
@@ -634,7 +548,7 @@ static int igb_request_msix(struct igb_adapter *adapter)
                        sprintf(q_vector->name, "%s-unused", netdev->name);
 
                err = request_irq(adapter->msix_entries[vector].vector,
-                                 &igb_msix_ring, 0, q_vector->name,
+                                 igb_msix_ring, 0, q_vector->name,
                                  q_vector);
                if (err)
                        goto out;
@@ -704,14 +618,15 @@ static void igb_set_interrupt_capability(struct igb_adapter *adapter)
        int numvecs, i;
 
        /* Number of supported queues. */
-       adapter->num_rx_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus());
-       adapter->num_tx_queues = min_t(u32, IGB_MAX_TX_QUEUES, num_online_cpus());
+       adapter->num_rx_queues = adapter->rss_queues;
+       adapter->num_tx_queues = adapter->rss_queues;
 
        /* start with one vector for every rx queue */
        numvecs = adapter->num_rx_queues;
 
        /* if tx handler is seperate add 1 for every tx queue */
-       numvecs += adapter->num_tx_queues;
+       if (!(adapter->flags & IGB_FLAG_QUEUE_PAIRS))
+               numvecs += adapter->num_tx_queues;
 
        /* store the number of vectors reserved for queues */
        adapter->num_q_vectors = numvecs;
@@ -751,6 +666,9 @@ msi_only:
                dev_info(&adapter->pdev->dev, "IOV Disabled\n");
        }
 #endif
+       adapter->vfs_allocated_count = 0;
+       adapter->rss_queues = 1;
+       adapter->flags |= IGB_FLAG_QUEUE_PAIRS;
        adapter->num_rx_queues = 1;
        adapter->num_tx_queues = 1;
        adapter->num_q_vectors = 1;
@@ -808,7 +726,9 @@ static void igb_map_rx_ring_to_vector(struct igb_adapter *adapter,
        q_vector = adapter->q_vector[v_idx];
        q_vector->rx_ring = &adapter->rx_ring[ring_idx];
        q_vector->rx_ring->q_vector = q_vector;
-       q_vector->itr_val = adapter->itr;
+       q_vector->itr_val = adapter->rx_itr_setting;
+       if (q_vector->itr_val && q_vector->itr_val <= 3)
+               q_vector->itr_val = IGB_START_ITR;
 }
 
 static void igb_map_tx_ring_to_vector(struct igb_adapter *adapter,
@@ -819,7 +739,9 @@ static void igb_map_tx_ring_to_vector(struct igb_adapter *adapter,
        q_vector = adapter->q_vector[v_idx];
        q_vector->tx_ring = &adapter->tx_ring[ring_idx];
        q_vector->tx_ring->q_vector = q_vector;
-       q_vector->itr_val = adapter->itr;
+       q_vector->itr_val = adapter->tx_itr_setting;
+       if (q_vector->itr_val && q_vector->itr_val <= 3)
+               q_vector->itr_val = IGB_START_ITR;
 }
 
 /**
@@ -953,7 +875,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
        }
 
        if (adapter->flags & IGB_FLAG_HAS_MSI) {
-               err = request_irq(adapter->pdev->irq, &igb_intr_msi, 0,
+               err = request_irq(adapter->pdev->irq, igb_intr_msi, 0,
                                  netdev->name, adapter);
                if (!err)
                        goto request_done;
@@ -963,7 +885,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
                adapter->flags &= ~IGB_FLAG_HAS_MSI;
        }
 
-       err = request_irq(adapter->pdev->irq, &igb_intr, IRQF_SHARED,
+       err = request_irq(adapter->pdev->irq, igb_intr, IRQF_SHARED,
                          netdev->name, adapter);
 
        if (err)
@@ -999,6 +921,11 @@ static void igb_irq_disable(struct igb_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
 
+       /*
+        * we need to be careful when disabling interrupts.  The VFs are also
+        * mapped into these registers and so clearing the bits can cause
+        * issues on the VF drivers so we only need to clear what we set
+        */
        if (adapter->msix_entries) {
                u32 regval = rd32(E1000_EIAM);
                wr32(E1000_EIAM, regval & ~adapter->eims_enable_mask);
@@ -1022,15 +949,17 @@ static void igb_irq_enable(struct igb_adapter *adapter)
        struct e1000_hw *hw = &adapter->hw;
 
        if (adapter->msix_entries) {
+               u32 ims = E1000_IMS_LSC | E1000_IMS_DOUTSYNC;
                u32 regval = rd32(E1000_EIAC);
                wr32(E1000_EIAC, regval | adapter->eims_enable_mask);
                regval = rd32(E1000_EIAM);
                wr32(E1000_EIAM, regval | adapter->eims_enable_mask);
                wr32(E1000_EIMS, adapter->eims_enable_mask);
-               if (adapter->vfs_allocated_count)
+               if (adapter->vfs_allocated_count) {
                        wr32(E1000_MBVFIMR, 0xFF);
-               wr32(E1000_IMS, (E1000_IMS_LSC | E1000_IMS_VMMB |
-                                E1000_IMS_DOUTSYNC));
+                       ims |= E1000_IMS_VMMB;
+               }
+               wr32(E1000_IMS, ims);
        } else {
                wr32(E1000_IMS, IMS_ENABLE_MASK);
                wr32(E1000_IAM, IMS_ENABLE_MASK);
@@ -1039,24 +968,23 @@ static void igb_irq_enable(struct igb_adapter *adapter)
 
 static void igb_update_mng_vlan(struct igb_adapter *adapter)
 {
-       struct net_device *netdev = adapter->netdev;
+       struct e1000_hw *hw = &adapter->hw;
        u16 vid = adapter->hw.mng_cookie.vlan_id;
        u16 old_vid = adapter->mng_vlan_id;
-       if (adapter->vlgrp) {
-               if (!vlan_group_get_device(adapter->vlgrp, vid)) {
-                       if (adapter->hw.mng_cookie.status &
-                               E1000_MNG_DHCP_COOKIE_STATUS_VLAN) {
-                               igb_vlan_rx_add_vid(netdev, vid);
-                               adapter->mng_vlan_id = vid;
-                       } else
-                               adapter->mng_vlan_id = IGB_MNG_VLAN_NONE;
 
-                       if ((old_vid != (u16)IGB_MNG_VLAN_NONE) &&
-                                       (vid != old_vid) &&
-                           !vlan_group_get_device(adapter->vlgrp, old_vid))
-                               igb_vlan_rx_kill_vid(netdev, old_vid);
-               } else
-                       adapter->mng_vlan_id = vid;
+       if (hw->mng_cookie.status & E1000_MNG_DHCP_COOKIE_STATUS_VLAN) {
+               /* add VID to filter table */
+               igb_vfta_set(hw, vid, true);
+               adapter->mng_vlan_id = vid;
+       } else {
+               adapter->mng_vlan_id = IGB_MNG_VLAN_NONE;
+       }
+
+       if ((old_vid != (u16)IGB_MNG_VLAN_NONE) &&
+           (vid != old_vid) &&
+           !vlan_group_get_device(adapter->vlgrp, old_vid)) {
+               /* remove VID from filter table */
+               igb_vfta_set(hw, old_vid, false);
        }
 }
 
@@ -1080,7 +1008,6 @@ static void igb_release_hw_control(struct igb_adapter *adapter)
                        ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
 }
 
-
 /**
  * igb_get_hw_control - get control of the h/w from f/w
  * @adapter: address of board private structure
@@ -1141,7 +1068,6 @@ static void igb_configure(struct igb_adapter *adapter)
  * igb_up - Open the interface and prepare it to handle traffic
  * @adapter: board private structure
  **/
-
 int igb_up(struct igb_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
@@ -1159,8 +1085,6 @@ int igb_up(struct igb_adapter *adapter)
        if (adapter->msix_entries)
                igb_configure_msix(adapter);
 
-       igb_set_vmolr(hw, adapter->vfs_allocated_count);
-
        /* Clear any pending interrupts. */
        rd32(E1000_ICR);
        igb_irq_enable(adapter);
@@ -1174,15 +1098,17 @@ int igb_up(struct igb_adapter *adapter)
 
        netif_tx_start_all_queues(adapter->netdev);
 
-       /* Fire a link change interrupt to start the watchdog. */
-       wr32(E1000_ICS, E1000_ICS_LSC);
+       /* start the watchdog. */
+       hw->mac.get_link_status = 1;
+       schedule_work(&adapter->watchdog_task);
+
        return 0;
 }
 
 void igb_down(struct igb_adapter *adapter)
 {
-       struct e1000_hw *hw = &adapter->hw;
        struct net_device *netdev = adapter->netdev;
+       struct e1000_hw *hw = &adapter->hw;
        u32 tctl, rctl;
        int i;
 
@@ -1247,6 +1173,7 @@ void igb_reinit_locked(struct igb_adapter *adapter)
 
 void igb_reset(struct igb_adapter *adapter)
 {
+       struct pci_dev *pdev = adapter->pdev;
        struct e1000_hw *hw = &adapter->hw;
        struct e1000_mac_info *mac = &hw->mac;
        struct e1000_fc_info *fc = &hw->fc;
@@ -1258,7 +1185,8 @@ void igb_reset(struct igb_adapter *adapter)
         */
        switch (mac->type) {
        case e1000_82576:
-               pba = E1000_PBA_64K;
+               pba = rd32(E1000_RXPBS);
+               pba &= E1000_RXPBS_SIZE_MASK_82576;
                break;
        case e1000_82575:
        default:
@@ -1333,10 +1261,10 @@ void igb_reset(struct igb_adapter *adapter)
        if (adapter->vfs_allocated_count) {
                int i;
                for (i = 0 ; i < adapter->vfs_allocated_count; i++)
-                       adapter->vf_data[i].clear_to_send = false;
+                       adapter->vf_data[i].flags = 0;
 
                /* ping all the active vfs to let them know we are going down */
-                       igb_ping_all_vfs(adapter);
+               igb_ping_all_vfs(adapter);
 
                /* disable transmits and receives */
                wr32(E1000_VFRE, 0);
@@ -1344,23 +1272,23 @@ void igb_reset(struct igb_adapter *adapter)
        }
 
        /* Allow time for pending master requests to run */
-       adapter->hw.mac.ops.reset_hw(&adapter->hw);
+       hw->mac.ops.reset_hw(hw);
        wr32(E1000_WUC, 0);
 
-       if (adapter->hw.mac.ops.init_hw(&adapter->hw))
-               dev_err(&adapter->pdev->dev, "Hardware Error\n");
+       if (hw->mac.ops.init_hw(hw))
+               dev_err(&pdev->dev, "Hardware Error\n");
 
        igb_update_mng_vlan(adapter);
 
        /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
        wr32(E1000_VET, ETHERNET_IEEE_VLAN_TYPE);
 
-       igb_reset_adaptive(&adapter->hw);
-       igb_get_phy_info(&adapter->hw);
+       igb_reset_adaptive(hw);
+       igb_get_phy_info(hw);
 }
 
 static const struct net_device_ops igb_netdev_ops = {
-       .ndo_open               = igb_open,
+       .ndo_open               = igb_open,
        .ndo_stop               = igb_close,
        .ndo_start_xmit         = igb_xmit_frame_adv,
        .ndo_get_stats          = igb_get_stats,
@@ -1396,10 +1324,11 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        struct net_device *netdev;
        struct igb_adapter *adapter;
        struct e1000_hw *hw;
+       u16 eeprom_data = 0;
+       static int global_quad_port_a; /* global quad port a indication */
        const struct e1000_info *ei = igb_info_tbl[ent->driver_data];
        unsigned long mmio_start, mmio_len;
        int err, pci_using_dac;
-       u16 eeprom_data = 0;
        u16 eeprom_apme_mask = IGB_EEPROM_APME;
        u32 part_num;
 
@@ -1476,8 +1405,6 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        hw->subsystem_vendor_id = pdev->subsystem_vendor;
        hw->subsystem_device_id = pdev->subsystem_device;
 
-       /* setup the private structure */
-       hw->back = adapter;
        /* Copy the default MAC, PHY and NVM function pointers */
        memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops));
        memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops));
@@ -1487,46 +1414,6 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        if (err)
                goto err_sw_init;
 
-#ifdef CONFIG_PCI_IOV
-       /* since iov functionality isn't critical to base device function we
-        * can accept failure.  If it fails we don't allow iov to be enabled */
-       if (hw->mac.type == e1000_82576) {
-               /* 82576 supports a maximum of 7 VFs in addition to the PF */
-               unsigned int num_vfs = (max_vfs > 7) ? 7 : max_vfs;
-               int i;
-               unsigned char mac_addr[ETH_ALEN];
-
-               if (num_vfs) {
-                       adapter->vf_data = kcalloc(num_vfs,
-                                               sizeof(struct vf_data_storage),
-                                               GFP_KERNEL);
-                       if (!adapter->vf_data) {
-                               dev_err(&pdev->dev,
-                                       "Could not allocate VF private data - "
-                                       "IOV enable failed\n");
-                       } else {
-                               err = pci_enable_sriov(pdev, num_vfs);
-                               if (!err) {
-                                       adapter->vfs_allocated_count = num_vfs;
-                                       dev_info(&pdev->dev,
-                                                "%d vfs allocated\n",
-                                                num_vfs);
-                                       for (i = 0;
-                                            i < adapter->vfs_allocated_count;
-                                            i++) {
-                                               random_ether_addr(mac_addr);
-                                               igb_set_vf_mac(adapter, i,
-                                                              mac_addr);
-                                       }
-                               } else {
-                                       kfree(adapter->vf_data);
-                                       adapter->vf_data = NULL;
-                               }
-                       }
-               }
-       }
-
-#endif
        /* setup the private structure */
        err = igb_sw_init(adapter);
        if (err)
@@ -1557,7 +1444,6 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        netdev->features |= NETIF_F_IPV6_CSUM;
        netdev->features |= NETIF_F_TSO;
        netdev->features |= NETIF_F_TSO6;
-
        netdev->features |= NETIF_F_GRO;
 
        netdev->vlan_features |= NETIF_F_TSO;
@@ -1569,10 +1455,10 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        if (pci_using_dac)
                netdev->features |= NETIF_F_HIGHDMA;
 
-       if (adapter->hw.mac.type == e1000_82576)
+       if (hw->mac.type >= e1000_82576)
                netdev->features |= NETIF_F_SCTP_CSUM;
 
-       adapter->en_mng_pt = igb_enable_mng_pass_thru(&adapter->hw);
+       adapter->en_mng_pt = igb_enable_mng_pass_thru(hw);
 
        /* before reading the NVM, reset the controller to put the device in a
         * known good starting state */
@@ -1614,9 +1500,6 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        hw->fc.requested_mode = e1000_fc_default;
        hw->fc.current_mode = e1000_fc_default;
 
-       adapter->itr_setting = IGB_DEFAULT_ITR;
-       adapter->itr = IGB_START_ITR;
-
        igb_validate_mdi_setting(hw);
 
        /* Initial Wake on LAN setting If APM wake is enabled in the EEPROM,
@@ -1683,66 +1566,14 @@ static int __devinit igb_probe(struct pci_dev *pdev,
                dev_info(&pdev->dev, "DCA enabled\n");
                igb_setup_dca(adapter);
        }
-#endif
 
-       /*
-        * Initialize hardware timer: we keep it running just in case
-        * that some program needs it later on.
-        */
-       memset(&adapter->cycles, 0, sizeof(adapter->cycles));
-       adapter->cycles.read = igb_read_clock;
-       adapter->cycles.mask = CLOCKSOURCE_MASK(64);
-       adapter->cycles.mult = 1;
-       adapter->cycles.shift = IGB_TSYNC_SHIFT;
-       wr32(E1000_TIMINCA,
-            (1<<24) |
-            IGB_TSYNC_CYCLE_TIME_IN_NANOSECONDS * IGB_TSYNC_SCALE);
-#if 0
-       /*
-        * Avoid rollover while we initialize by resetting the time counter.
-        */
-       wr32(E1000_SYSTIML, 0x00000000);
-       wr32(E1000_SYSTIMH, 0x00000000);
-#else
-       /*
-        * Set registers so that rollover occurs soon to test this.
-        */
-       wr32(E1000_SYSTIML, 0x00000000);
-       wr32(E1000_SYSTIMH, 0xFF800000);
 #endif
-       wrfl();
-       timecounter_init(&adapter->clock,
-                        &adapter->cycles,
-                        ktime_to_ns(ktime_get_real()));
-
-       /*
-        * Synchronize our NIC clock against system wall clock. NIC
-        * time stamp reading requires ~3us per sample, each sample
-        * was pretty stable even under load => only require 10
-        * samples for each offset comparison.
-        */
-       memset(&adapter->compare, 0, sizeof(adapter->compare));
-       adapter->compare.source = &adapter->clock;
-       adapter->compare.target = ktime_get_real;
-       adapter->compare.num_samples = 10;
-       timecompare_update(&adapter->compare, 0);
-
-#ifdef DEBUG
-       {
-               char buffer[160];
-               printk(KERN_DEBUG
-                       "igb: %s: hw %p initialized timer\n",
-                       igb_get_time_str(adapter, buffer),
-                       &adapter->hw);
-       }
-#endif
-
        dev_info(&pdev->dev, "Intel(R) Gigabit Ethernet Network Connection\n");
        /* print bus type/speed/width info */
        dev_info(&pdev->dev, "%s: (PCIe:%s:%s) %pM\n",
                 netdev->name,
-                ((hw->bus.speed == e1000_bus_speed_2500)
-                 ? "2.5Gb/s" : "unknown"),
+                ((hw->bus.speed == e1000_bus_speed_2500) ? "2.5Gb/s" :
+                                                           "unknown"),
                 ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" :
                  (hw->bus.width == e1000_bus_width_pcie_x2) ? "Width x2" :
                  (hw->bus.width == e1000_bus_width_pcie_x1) ? "Width x1" :
@@ -1775,8 +1606,8 @@ err_sw_init:
 err_ioremap:
        free_netdev(netdev);
 err_alloc_etherdev:
-       pci_release_selected_regions(pdev, pci_select_bars(pdev,
-                                    IORESOURCE_MEM));
+       pci_release_selected_regions(pdev,
+                                    pci_select_bars(pdev, IORESOURCE_MEM));
 err_pci_reg:
 err_dma:
        pci_disable_device(pdev);
@@ -1821,8 +1652,8 @@ static void __devexit igb_remove(struct pci_dev *pdev)
 
        unregister_netdev(netdev);
 
-       if (!igb_check_reset_block(&adapter->hw))
-               igb_reset_phy(&adapter->hw);
+       if (!igb_check_reset_block(hw))
+               igb_reset_phy(hw);
 
        igb_clear_interrupt_scheme(adapter);
 
@@ -1840,11 +1671,12 @@ static void __devexit igb_remove(struct pci_dev *pdev)
                dev_info(&pdev->dev, "IOV Disabled\n");
        }
 #endif
+
        iounmap(hw->hw_addr);
        if (hw->flash_address)
                iounmap(hw->flash_address);
-       pci_release_selected_regions(pdev, pci_select_bars(pdev,
-                                    IORESOURCE_MEM));
+       pci_release_selected_regions(pdev,
+                                    pci_select_bars(pdev, IORESOURCE_MEM));
 
        free_netdev(netdev);
 
@@ -1853,6 +1685,118 @@ static void __devexit igb_remove(struct pci_dev *pdev)
        pci_disable_device(pdev);
 }
 
+/**
+ * igb_probe_vfs - Initialize vf data storage and add VFs to pci config space
+ * @adapter: board private structure to initialize
+ *
+ * This function initializes the vf specific data storage and then attempts to
+ * allocate the VFs.  The reason for ordering it this way is because it is much
+ * mor expensive time wise to disable SR-IOV than it is to allocate and free
+ * the memory for the VFs.
+ **/
+static void __devinit igb_probe_vfs(struct igb_adapter * adapter)
+{
+#ifdef CONFIG_PCI_IOV
+       struct pci_dev *pdev = adapter->pdev;
+
+       if (adapter->vfs_allocated_count > 7)
+               adapter->vfs_allocated_count = 7;
+
+       if (adapter->vfs_allocated_count) {
+               adapter->vf_data = kcalloc(adapter->vfs_allocated_count,
+                                          sizeof(struct vf_data_storage),
+                                          GFP_KERNEL);
+               /* if allocation failed then we do not support SR-IOV */
+               if (!adapter->vf_data) {
+                       adapter->vfs_allocated_count = 0;
+                       dev_err(&pdev->dev, "Unable to allocate memory for VF "
+                               "Data Storage\n");
+               }
+       }
+
+       if (pci_enable_sriov(pdev, adapter->vfs_allocated_count)) {
+               kfree(adapter->vf_data);
+               adapter->vf_data = NULL;
+#endif /* CONFIG_PCI_IOV */
+               adapter->vfs_allocated_count = 0;
+#ifdef CONFIG_PCI_IOV
+       } else {
+               unsigned char mac_addr[ETH_ALEN];
+               int i;
+               dev_info(&pdev->dev, "%d vfs allocated\n",
+                        adapter->vfs_allocated_count);
+               for (i = 0; i < adapter->vfs_allocated_count; i++) {
+                       random_ether_addr(mac_addr);
+                       igb_set_vf_mac(adapter, i, mac_addr);
+               }
+       }
+#endif /* CONFIG_PCI_IOV */
+}
+
+
+/**
+ * igb_init_hw_timer - Initialize hardware timer used with IEEE 1588 timestamp
+ * @adapter: board private structure to initialize
+ *
+ * igb_init_hw_timer initializes the function pointer and values for the hw
+ * timer found in hardware.
+ **/
+static void igb_init_hw_timer(struct igb_adapter *adapter)
+{
+       struct e1000_hw *hw = &adapter->hw;
+
+       switch (hw->mac.type) {
+       case e1000_82576:
+               /*
+                * Initialize hardware timer: we keep it running just in case
+                * that some program needs it later on.
+                */
+               memset(&adapter->cycles, 0, sizeof(adapter->cycles));
+               adapter->cycles.read = igb_read_clock;
+               adapter->cycles.mask = CLOCKSOURCE_MASK(64);
+               adapter->cycles.mult = 1;
+               /**
+                * Scale the NIC clock cycle by a large factor so that
+                * relatively small clock corrections can be added or
+                * substracted at each clock tick. The drawbacks of a large
+                * factor are a) that the clock register overflows more quickly
+                * (not such a big deal) and b) that the increment per tick has
+                * to fit into 24 bits.  As a result we need to use a shift of
+                * 19 so we can fit a value of 16 into the TIMINCA register.
+                */
+               adapter->cycles.shift = IGB_82576_TSYNC_SHIFT;
+               wr32(E1000_TIMINCA,
+                               (1 << E1000_TIMINCA_16NS_SHIFT) |
+                               (16 << IGB_82576_TSYNC_SHIFT));
+
+               /* Set registers so that rollover occurs soon to test this. */
+               wr32(E1000_SYSTIML, 0x00000000);
+               wr32(E1000_SYSTIMH, 0xFF800000);
+               wrfl();
+
+               timecounter_init(&adapter->clock,
+                                &adapter->cycles,
+                                ktime_to_ns(ktime_get_real()));
+               /*
+                * Synchronize our NIC clock against system wall clock. NIC
+                * time stamp reading requires ~3us per sample, each sample
+                * was pretty stable even under load => only require 10
+                * samples for each offset comparison.
+                */
+               memset(&adapter->compare, 0, sizeof(adapter->compare));
+               adapter->compare.source = &adapter->clock;
+               adapter->compare.target = ktime_get_real;
+               adapter->compare.num_samples = 10;
+               timecompare_update(&adapter->compare, 0);
+               break;
+       case e1000_82575:
+               /* 82575 does not support timesync */
+       default:
+               break;
+       }
+
+}
+
 /**
  * igb_sw_init - Initialize general software structures (struct igb_adapter)
  * @adapter: board private structure to initialize
@@ -1871,16 +1815,37 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)
 
        adapter->tx_ring_count = IGB_DEFAULT_TXD;
        adapter->rx_ring_count = IGB_DEFAULT_RXD;
+       adapter->rx_itr_setting = IGB_DEFAULT_ITR;
+       adapter->tx_itr_setting = IGB_DEFAULT_ITR;
+
        adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
        adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
 
-       /* This call may decrease the number of queues depending on
-        * interrupt mode. */
+#ifdef CONFIG_PCI_IOV
+       if (hw->mac.type == e1000_82576)
+               adapter->vfs_allocated_count = max_vfs;
+
+#endif /* CONFIG_PCI_IOV */
+       adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus());
+
+       /*
+        * if rss_queues > 4 or vfs are going to be allocated with rss_queues
+        * then we should combine the queues into a queue pair in order to
+        * conserve interrupts due to limited supply
+        */
+       if ((adapter->rss_queues > 4) ||
+           ((adapter->rss_queues > 1) && (adapter->vfs_allocated_count > 6)))
+               adapter->flags |= IGB_FLAG_QUEUE_PAIRS;
+
+       /* This call may decrease the number of queues */
        if (igb_init_interrupt_scheme(adapter)) {
                dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
                return -ENOMEM;
        }
 
+       igb_init_hw_timer(adapter);
+       igb_probe_vfs(adapter);
+
        /* Explicitly disable IRQ since the NIC can be in any state. */
        igb_irq_disable(adapter);
 
@@ -1925,19 +1890,12 @@ static int igb_open(struct net_device *netdev)
 
        /* e1000_power_up_phy(adapter); */
 
-       adapter->mng_vlan_id = IGB_MNG_VLAN_NONE;
-       if ((adapter->hw.mng_cookie.status &
-            E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
-               igb_update_mng_vlan(adapter);
-
        /* before we allocate an interrupt, we must be ready to handle it.
         * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
         * as soon as we call pci_request_irq, so we have to setup our
         * clean_rx handler before we do so.  */
        igb_configure(adapter);
 
-       igb_set_vmolr(hw, adapter->vfs_allocated_count);
-
        err = igb_request_irq(adapter);
        if (err)
                goto err_req_irq;
@@ -1964,8 +1922,9 @@ static int igb_open(struct net_device *netdev)
 
        netif_tx_start_all_queues(netdev);
 
-       /* Fire a link status change interrupt to start the watchdog. */
-       wr32(E1000_ICS, E1000_ICS_LSC);
+       /* start the watchdog. */
+       hw->mac.get_link_status = 1;
+       schedule_work(&adapter->watchdog_task);
 
        return 0;
 
@@ -2004,14 +1963,6 @@ static int igb_close(struct net_device *netdev)
        igb_free_all_tx_resources(adapter);
        igb_free_all_rx_resources(adapter);
 
-       /* kill manageability vlan ID if supported, but not if a vlan with
-        * the same ID is registered on the host OS (let 8021q kill it) */
-       if ((adapter->hw.mng_cookie.status &
-                         E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
-            !(adapter->vlgrp &&
-              vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id)))
-               igb_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
-
        return 0;
 }
 
@@ -2036,7 +1987,8 @@ int igb_setup_tx_resources(struct igb_ring *tx_ring)
        tx_ring->size = tx_ring->count * sizeof(union e1000_adv_tx_desc);
        tx_ring->size = ALIGN(tx_ring->size, 4096);
 
-       tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size,
+       tx_ring->desc = pci_alloc_consistent(pdev,
+                                            tx_ring->size,
                                             &tx_ring->dma);
 
        if (!tx_ring->desc)
@@ -2062,13 +2014,13 @@ err:
  **/
 static int igb_setup_all_tx_resources(struct igb_adapter *adapter)
 {
+       struct pci_dev *pdev = adapter->pdev;
        int i, err = 0;
-       int r_idx;
 
        for (i = 0; i < adapter->num_tx_queues; i++) {
                err = igb_setup_tx_resources(&adapter->tx_ring[i]);
                if (err) {
-                       dev_err(&adapter->pdev->dev,
+                       dev_err(&pdev->dev,
                                "Allocation for Tx Queue %u failed\n", i);
                        for (i--; i >= 0; i--)
                                igb_free_tx_resources(&adapter->tx_ring[i]);
@@ -2076,8 +2028,8 @@ static int igb_setup_all_tx_resources(struct igb_adapter *adapter)
                }
        }
 
-       for (i = 0; i < IGB_MAX_TX_QUEUES; i++) {
-               r_idx = i % adapter->num_tx_queues;
+       for (i = 0; i < IGB_ABS_MAX_TX_QUEUES; i++) {
+               int r_idx = i % adapter->num_tx_queues;
                adapter->multi_tx_table[i] = &adapter->tx_ring[r_idx];
        }
        return err;
@@ -2087,7 +2039,7 @@ static int igb_setup_all_tx_resources(struct igb_adapter *adapter)
  * igb_setup_tctl - configure the transmit control registers
  * @adapter: Board private structure
  **/
-static void igb_setup_tctl(struct igb_adapter *adapter)
+void igb_setup_tctl(struct igb_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
        u32 tctl;
@@ -2116,8 +2068,8 @@ static void igb_setup_tctl(struct igb_adapter *adapter)
  *
  * Configure a transmit ring after a reset.
  **/
-static void igb_configure_tx_ring(struct igb_adapter *adapter,
-                                  struct igb_ring *ring)
+void igb_configure_tx_ring(struct igb_adapter *adapter,
+                           struct igb_ring *ring)
 {
        struct e1000_hw *hw = &adapter->hw;
        u32 txdctl;
@@ -2200,6 +2152,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
 
 err:
        vfree(rx_ring->buffer_info);
+       rx_ring->buffer_info = NULL;
        dev_err(&pdev->dev, "Unable to allocate memory for "
                "the receive descriptor ring\n");
        return -ENOMEM;
@@ -2214,12 +2167,13 @@ err:
  **/
 static int igb_setup_all_rx_resources(struct igb_adapter *adapter)
 {
+       struct pci_dev *pdev = adapter->pdev;
        int i, err = 0;
 
        for (i = 0; i < adapter->num_rx_queues; i++) {
                err = igb_setup_rx_resources(&adapter->rx_ring[i]);
                if (err) {
-                       dev_err(&adapter->pdev->dev,
+                       dev_err(&pdev->dev,
                                "Allocation for Rx Queue %u failed\n", i);
                        for (i--; i >= 0; i--)
                                igb_free_rx_resources(&adapter->rx_ring[i]);
@@ -2258,7 +2212,7 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)
                array_wr32(E1000_RSSRK(0), j, rsskey);
        }
 
-       num_rx_queues = adapter->num_rx_queues;
+       num_rx_queues = adapter->rss_queues;
 
        if (adapter->vfs_allocated_count) {
                /* 82575 and 82576 supports 2 RSS queues for VMDq */
@@ -2314,7 +2268,7 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)
                                E1000_VT_CTL_DEFAULT_POOL_SHIFT;
                        wr32(E1000_VT_CTL, vtctl);
                }
-               if (adapter->num_rx_queues > 1)
+               if (adapter->rss_queues > 1)
                        mrqc = E1000_MRQC_ENABLE_VMDQ_RSS_2Q;
                else
                        mrqc = E1000_MRQC_ENABLE_VMDQ;
@@ -2339,7 +2293,7 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)
  * igb_setup_rctl - configure the receive control registers
  * @adapter: Board private structure
  **/
-static void igb_setup_rctl(struct igb_adapter *adapter)
+void igb_setup_rctl(struct igb_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
        u32 rctl;
@@ -2359,9 +2313,7 @@ static void igb_setup_rctl(struct igb_adapter *adapter)
         */
        rctl |= E1000_RCTL_SECRC;
 
-       /*
-        * disable store bad packets and clear size bits.
-        */
+       /* disable store bad packets and clear size bits. */
        rctl &= ~(E1000_RCTL_SBP | E1000_RCTL_SZ_256);
 
        /* enable LPE to prevent packets larger than max_frame_size */
@@ -2375,22 +2327,33 @@ static void igb_setup_rctl(struct igb_adapter *adapter)
         * if an un-trusted VF does not provide descriptors to hardware.
         */
        if (adapter->vfs_allocated_count) {
-               u32 vmolr;
-
                /* set all queue drop enable bits */
                wr32(E1000_QDE, ALL_QUEUES);
-
-               vmolr = rd32(E1000_VMOLR(adapter->vfs_allocated_count));
-               if (rctl & E1000_RCTL_LPE)
-                       vmolr |= E1000_VMOLR_LPE;
-               if (adapter->num_rx_queues > 1)
-                       vmolr |= E1000_VMOLR_RSSE;
-               wr32(E1000_VMOLR(adapter->vfs_allocated_count), vmolr);
        }
 
        wr32(E1000_RCTL, rctl);
 }
 
+static inline int igb_set_vf_rlpml(struct igb_adapter *adapter, int size,
+                                   int vfn)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       u32 vmolr;
+
+       /* if it isn't the PF check to see if VFs are enabled and
+        * increase the size to support vlan tags */
+       if (vfn < adapter->vfs_allocated_count &&
+           adapter->vf_data[vfn].vlans_enabled)
+               size += VLAN_TAG_SIZE;
+
+       vmolr = rd32(E1000_VMOLR(vfn));
+       vmolr &= ~E1000_VMOLR_RLPML_MASK;
+       vmolr |= size | E1000_VMOLR_LPE;
+       wr32(E1000_VMOLR(vfn), vmolr);
+
+       return 0;
+}
+
 /**
  * igb_rlpml_set - set maximum receive packet size
  * @adapter: board private structure
@@ -2410,12 +2373,43 @@ static void igb_rlpml_set(struct igb_adapter *adapter)
         * size and set the VMOLR RLPML to the size we need */
        if (pf_id) {
                igb_set_vf_rlpml(adapter, max_frame_size, pf_id);
-               max_frame_size = MAX_STD_JUMBO_FRAME_SIZE + VLAN_TAG_SIZE;
+               max_frame_size = MAX_JUMBO_FRAME_SIZE;
        }
 
        wr32(E1000_RLPML, max_frame_size);
 }
 
+static inline void igb_set_vmolr(struct igb_adapter *adapter, int vfn)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       u32 vmolr;
+
+       /*
+        * This register exists only on 82576 and newer so if we are older then
+        * we should exit and do nothing
+        */
+       if (hw->mac.type < e1000_82576)
+               return;
+
+       vmolr = rd32(E1000_VMOLR(vfn));
+       vmolr |= E1000_VMOLR_AUPE |        /* Accept untagged packets */
+                E1000_VMOLR_STRVLAN;      /* Strip vlan tags */
+
+       /* clear all bits that might not be set */
+       vmolr &= ~(E1000_VMOLR_BAM | E1000_VMOLR_RSSE);
+
+       if (adapter->rss_queues > 1 && vfn == adapter->vfs_allocated_count)
+               vmolr |= E1000_VMOLR_RSSE; /* enable RSS */
+       /*
+        * for VMDq only allow the VFs and pool 0 to accept broadcast and
+        * multicast packets
+        */
+       if (vfn <= adapter->vfs_allocated_count)
+               vmolr |= E1000_VMOLR_BAM;          /* Accept broadcast */
+
+       wr32(E1000_VMOLR(vfn), vmolr);
+}
+
 /**
  * igb_configure_rx_ring - Configure a receive ring after Reset
  * @adapter: board private structure
@@ -2423,8 +2417,8 @@ static void igb_rlpml_set(struct igb_adapter *adapter)
  *
  * Configure the Rx unit of the MAC after a reset.
  **/
-static void igb_configure_rx_ring(struct igb_adapter *adapter,
-                                  struct igb_ring *ring)
+void igb_configure_rx_ring(struct igb_adapter *adapter,
+                           struct igb_ring *ring)
 {
        struct e1000_hw *hw = &adapter->hw;
        u64 rdba = ring->dma;
@@ -2469,6 +2463,9 @@ static void igb_configure_rx_ring(struct igb_adapter *adapter,
 
        wr32(E1000_SRRCTL(reg_idx), srrctl);
 
+       /* set filtering for VMDQ pools */
+       igb_set_vmolr(adapter, reg_idx & 0x7);
+
        /* enable receive descriptor fetching */
        rxdctl = rd32(E1000_RXDCTL(reg_idx));
        rxdctl |= E1000_RXDCTL_QUEUE_ENABLE;
@@ -2515,6 +2512,10 @@ void igb_free_tx_resources(struct igb_ring *tx_ring)
        vfree(tx_ring->buffer_info);
        tx_ring->buffer_info = NULL;
 
+       /* if not set, then don't free */
+       if (!tx_ring->desc)
+               return;
+
        pci_free_consistent(tx_ring->pdev, tx_ring->size,
                            tx_ring->desc, tx_ring->dma);
 
@@ -2535,8 +2536,8 @@ static void igb_free_all_tx_resources(struct igb_adapter *adapter)
                igb_free_tx_resources(&adapter->tx_ring[i]);
 }
 
-static void igb_unmap_and_free_tx_resource(struct igb_ring *tx_ring,
-                                          struct igb_buffer *buffer_info)
+void igb_unmap_and_free_tx_resource(struct igb_ring *tx_ring,
+                                   struct igb_buffer *buffer_info)
 {
        buffer_info->dma = 0;
        if (buffer_info->skb) {
@@ -2573,14 +2574,10 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring)
        memset(tx_ring->buffer_info, 0, size);
 
        /* Zero out the descriptor ring */
-
        memset(tx_ring->desc, 0, tx_ring->size);
 
        tx_ring->next_to_use = 0;
        tx_ring->next_to_clean = 0;
-
-       writel(0, tx_ring->head);
-       writel(0, tx_ring->tail);
 }
 
 /**
@@ -2608,6 +2605,10 @@ void igb_free_rx_resources(struct igb_ring *rx_ring)
        vfree(rx_ring->buffer_info);
        rx_ring->buffer_info = NULL;
 
+       /* if not set, then don't free */
+       if (!rx_ring->desc)
+               return;
+
        pci_free_consistent(rx_ring->pdev, rx_ring->size,
                            rx_ring->desc, rx_ring->dma);
 
@@ -2640,6 +2641,7 @@ static void igb_clean_rx_ring(struct igb_ring *rx_ring)
 
        if (!rx_ring->buffer_info)
                return;
+
        /* Free all the Rx ring sk_buffs */
        for (i = 0; i < rx_ring->count; i++) {
                buffer_info = &rx_ring->buffer_info[i];
@@ -2677,9 +2679,6 @@ static void igb_clean_rx_ring(struct igb_ring *rx_ring)
 
        rx_ring->next_to_clean = 0;
        rx_ring->next_to_use = 0;
-
-       writel(0, rx_ring->head);
-       writel(0, rx_ring->tail);
 }
 
 /**
@@ -2940,36 +2939,33 @@ static void igb_watchdog(unsigned long data)
 static void igb_watchdog_task(struct work_struct *work)
 {
        struct igb_adapter *adapter = container_of(work,
-                                       struct igb_adapter, watchdog_task);
+                                                  struct igb_adapter,
+                                                   watchdog_task);
        struct e1000_hw *hw = &adapter->hw;
        struct net_device *netdev = adapter->netdev;
-       struct igb_ring *tx_ring = adapter->tx_ring;
        u32 link;
        int i;
 
        link = igb_has_link(adapter);
-       if ((netif_carrier_ok(netdev)) && link)
-               goto link_up;
-
        if (link) {
                if (!netif_carrier_ok(netdev)) {
                        u32 ctrl;
-                       hw->mac.ops.get_speed_and_duplex(&adapter->hw,
-                                                  &adapter->link_speed,
-                                                  &adapter->link_duplex);
+                       hw->mac.ops.get_speed_and_duplex(hw,
+                                                        &adapter->link_speed,
+                                                        &adapter->link_duplex);
 
                        ctrl = rd32(E1000_CTRL);
                        /* Links status message must follow this format */
                        printk(KERN_INFO "igb: %s NIC Link is Up %d Mbps %s, "
                                 "Flow Control: %s\n",
-                                netdev->name,
-                                adapter->link_speed,
-                                adapter->link_duplex == FULL_DUPLEX ?
+                              netdev->name,
+                              adapter->link_speed,
+                              adapter->link_duplex == FULL_DUPLEX ?
                                 "Full Duplex" : "Half Duplex",
-                                ((ctrl & E1000_CTRL_TFCE) && (ctrl &
-                                E1000_CTRL_RFCE)) ? "RX/TX" : ((ctrl &
-                                E1000_CTRL_RFCE) ? "RX" : ((ctrl &
-                                E1000_CTRL_TFCE) ? "TX" : "None")));
+                              ((ctrl & E1000_CTRL_TFCE) &&
+                               (ctrl & E1000_CTRL_RFCE)) ? "RX/TX" :
+                              ((ctrl & E1000_CTRL_RFCE) ?  "RX" :
+                              ((ctrl & E1000_CTRL_TFCE) ?  "TX" : "None")));
 
                        /* tweak tx_queue_len according to speed/duplex and
                         * adjust the timeout factor */
@@ -3013,32 +3009,26 @@ static void igb_watchdog_task(struct work_struct *work)
                }
        }
 
-link_up:
        igb_update_stats(adapter);
+       igb_update_adaptive(hw);
 
-       hw->mac.tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
-       adapter->tpt_old = adapter->stats.tpt;
-       hw->mac.collision_delta = adapter->stats.colc - adapter->colc_old;
-       adapter->colc_old = adapter->stats.colc;
-
-       adapter->gorc = adapter->stats.gorc - adapter->gorc_old;
-       adapter->gorc_old = adapter->stats.gorc;
-       adapter->gotc = adapter->stats.gotc - adapter->gotc_old;
-       adapter->gotc_old = adapter->stats.gotc;
-
-       igb_update_adaptive(&adapter->hw);
-
-       if (!netif_carrier_ok(netdev)) {
-               if (igb_desc_unused(tx_ring) + 1 < tx_ring->count) {
+       for (i = 0; i < adapter->num_tx_queues; i++) {
+               struct igb_ring *tx_ring = &adapter->tx_ring[i];
+               if (!netif_carrier_ok(netdev)) {
                        /* We've lost link, so the controller stops DMA,
                         * but we've got queued Tx work that's never going
                         * to get done, so reset controller to flush Tx.
                         * (Do the reset outside of interrupt context). */
-                       adapter->tx_timeout_count++;
-                       schedule_work(&adapter->reset_task);
-                       /* return immediately since reset is imminent */
-                       return;
+                       if (igb_desc_unused(tx_ring) + 1 < tx_ring->count) {
+                               adapter->tx_timeout_count++;
+                               schedule_work(&adapter->reset_task);
+                               /* return immediately since reset is imminent */
+                               return;
+                       }
                }
+
+               /* Force detection of hung controller every watchdog period */
+               tx_ring->detect_tx_hung = true;
        }
 
        /* Cause software interrupt to ensure rx ring is cleaned */
@@ -3053,9 +3043,6 @@ link_up:
                wr32(E1000_ICS, E1000_ICS_RXDMT0);
        }
 
-       /* Force detection of hung controller every watchdog period */
-       tx_ring->detect_tx_hung = true;
-
        /* Reset the timer */
        if (!test_bit(__IGB_DOWN, &adapter->state))
                mod_timer(&adapter->watchdog_timer,
@@ -3069,7 +3056,6 @@ enum latency_range {
        latency_invalid = 255
 };
 
-
 /**
  * igb_update_ring_itr - update the dynamic ITR value based on packet size
  *
@@ -3233,7 +3219,7 @@ static void igb_set_itr(struct igb_adapter *adapter)
        current_itr = max(adapter->rx_itr, adapter->tx_itr);
 
        /* conservative mode (itr 3) eliminates the lowest_latency setting */
-       if (adapter->itr_setting == 3 && current_itr == lowest_latency)
+       if (adapter->rx_itr_setting == 3 && current_itr == lowest_latency)
                current_itr = low_latency;
 
        switch (current_itr) {
@@ -3283,9 +3269,9 @@ set_itr_now:
 #define IGB_TX_FLAGS_VLAN              0x00000002
 #define IGB_TX_FLAGS_TSO               0x00000004
 #define IGB_TX_FLAGS_IPV4              0x00000008
-#define IGB_TX_FLAGS_TSTAMP             0x00000010
-#define IGB_TX_FLAGS_VLAN_MASK 0xffff0000
-#define IGB_TX_FLAGS_VLAN_SHIFT        16
+#define IGB_TX_FLAGS_TSTAMP            0x00000010
+#define IGB_TX_FLAGS_VLAN_MASK         0xffff0000
+#define IGB_TX_FLAGS_VLAN_SHIFT                        16
 
 static inline int igb_tso_adv(struct igb_ring *tx_ring,
                              struct sk_buff *skb, u32 tx_flags, u8 *hdr_len)
@@ -3384,6 +3370,7 @@ static inline bool igb_tx_csum_adv(struct igb_ring *tx_ring,
 
                if (tx_flags & IGB_TX_FLAGS_VLAN)
                        info |= (tx_flags & IGB_TX_FLAGS_VLAN_MASK);
+
                info |= (skb_network_offset(skb) << E1000_ADVTXD_MACLEN_SHIFT);
                if (skb->ip_summed == CHECKSUM_PARTIAL)
                        info |= skb_network_header_len(skb);
@@ -3500,17 +3487,17 @@ static inline int igb_tx_map_adv(struct igb_ring *tx_ring, struct sk_buff *skb,
        tx_ring->buffer_info[i].skb = skb;
        tx_ring->buffer_info[first].next_to_watch = i;
 
-       return count + 1;
+       return ++count;
 }
 
 static inline void igb_tx_queue_adv(struct igb_ring *tx_ring,
                                    int tx_flags, int count, u32 paylen,
                                    u8 hdr_len)
 {
-       union e1000_adv_tx_desc *tx_desc = NULL;
+       union e1000_adv_tx_desc *tx_desc;
        struct igb_buffer *buffer_info;
        u32 olinfo_status = 0, cmd_type_len;
-       unsigned int i;
+       unsigned int i = tx_ring->next_to_use;
 
        cmd_type_len = (E1000_ADVTXD_DTYP_DATA | E1000_ADVTXD_DCMD_IFCS |
                        E1000_ADVTXD_DCMD_DEXT);
@@ -3543,18 +3530,18 @@ static inline void igb_tx_queue_adv(struct igb_ring *tx_ring,
 
        olinfo_status |= ((paylen - hdr_len) << E1000_ADVTXD_PAYLEN_SHIFT);
 
-       i = tx_ring->next_to_use;
-       while (count--) {
+       do {
                buffer_info = &tx_ring->buffer_info[i];
                tx_desc = E1000_TX_DESC_ADV(*tx_ring, i);
                tx_desc->read.buffer_addr = cpu_to_le64(buffer_info->dma);
                tx_desc->read.cmd_type_len =
                        cpu_to_le32(cmd_type_len | buffer_info->length);
                tx_desc->read.olinfo_status = cpu_to_le32(olinfo_status);
+               count--;
                i++;
                if (i == tx_ring->count)
                        i = 0;
-       }
+       } while (count > 0);
 
        tx_desc->read.cmd_type_len |= cpu_to_le32(IGB_ADVTXD_DCMD);
        /* Force memory writes to complete before letting h/w
@@ -3599,26 +3586,15 @@ static int igb_maybe_stop_tx(struct igb_ring *tx_ring, int size)
        return __igb_maybe_stop_tx(tx_ring, size);
 }
 
-static netdev_tx_t igb_xmit_frame_ring_adv(struct sk_buff *skb,
-                                          struct igb_ring *tx_ring)
+netdev_tx_t igb_xmit_frame_ring_adv(struct sk_buff *skb,
+                                   struct igb_ring *tx_ring)
 {
        struct igb_adapter *adapter = netdev_priv(tx_ring->netdev);
        unsigned int first;
        unsigned int tx_flags = 0;
        u8 hdr_len = 0;
-       int count = 0;
-       int tso = 0;
-       union skb_shared_tx *shtx;
-
-       if (test_bit(__IGB_DOWN, &adapter->state)) {
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
-       }
-
-       if (skb->len <= 0) {
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
-       }
+       int tso = 0, count;
+       union skb_shared_tx *shtx = skb_tx(skb);
 
        /* need: 1 descriptor per page,
         *       + 2 desc gap to keep tail from touching head,
@@ -3630,22 +3606,12 @@ static netdev_tx_t igb_xmit_frame_ring_adv(struct sk_buff *skb,
                return NETDEV_TX_BUSY;
        }
 
-       /*
-        * TODO: check that there currently is no other packet with
-        * time stamping in the queue
-        *
-        * When doing time stamping, keep the connection to the socket
-        * a while longer: it is still needed by skb_hwtstamp_tx(),
-        * called either in igb_tx_hwtstamp() or by our caller when
-        * doing software time stamping.
-        */
-       shtx = skb_tx(skb);
        if (unlikely(shtx->hardware)) {
                shtx->in_progress = 1;
                tx_flags |= IGB_TX_FLAGS_TSTAMP;
        }
 
-       if (adapter->vlgrp && vlan_tx_tag_present(skb)) {
+       if (vlan_tx_tag_present(skb) && adapter->vlgrp) {
                tx_flags |= IGB_TX_FLAGS_VLAN;
                tx_flags |= (vlan_tx_tag_get(skb) << IGB_TX_FLAGS_VLAN_SHIFT);
        }
@@ -3656,6 +3622,7 @@ static netdev_tx_t igb_xmit_frame_ring_adv(struct sk_buff *skb,
        first = tx_ring->next_to_use;
        if (skb_is_gso(skb)) {
                tso = igb_tso_adv(tx_ring, skb, tx_flags, &hdr_len);
+
                if (tso < 0) {
                        dev_kfree_skb_any(skb);
                        return NETDEV_TX_OK;
@@ -3669,12 +3636,11 @@ static netdev_tx_t igb_xmit_frame_ring_adv(struct sk_buff *skb,
                tx_flags |= IGB_TX_FLAGS_CSUM;
 
        /*
-        * count reflects descriptors mapped, if 0 then mapping error
+        * count reflects descriptors mapped, if 0 or less then mapping error
         * has occured and we need to rewind the descriptor queue
         */
        count = igb_tx_map_adv(tx_ring, skb, first);
-
-       if (!count) {
+       if (count <= 0) {
                dev_kfree_skb_any(skb);
                tx_ring->buffer_info[first].time_stamp = 0;
                tx_ring->next_to_use = first;
@@ -3694,8 +3660,18 @@ static netdev_tx_t igb_xmit_frame_adv(struct sk_buff *skb,
 {
        struct igb_adapter *adapter = netdev_priv(netdev);
        struct igb_ring *tx_ring;
-
        int r_idx = 0;
+
+       if (test_bit(__IGB_DOWN, &adapter->state)) {
+               dev_kfree_skb_any(skb);
+               return NETDEV_TX_OK;
+       }
+
+       if (skb->len <= 0) {
+               dev_kfree_skb_any(skb);
+               return NETDEV_TX_OK;
+       }
+
        r_idx = skb->queue_mapping & (IGB_ABS_MAX_TX_QUEUES - 1);
        tx_ring = adapter->multi_tx_table[r_idx];
 
@@ -3717,6 +3693,7 @@ static void igb_tx_timeout(struct net_device *netdev)
 
        /* Do the reset outside of interrupt context */
        adapter->tx_timeout_count++;
+
        schedule_work(&adapter->reset_task);
        wr32(E1000_EICS,
             (adapter->eims_enable_mask & ~adapter->eims_other));
@@ -3753,17 +3730,17 @@ static struct net_device_stats *igb_get_stats(struct net_device *netdev)
 static int igb_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct igb_adapter *adapter = netdev_priv(netdev);
+       struct pci_dev *pdev = adapter->pdev;
        int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
        u32 rx_buffer_len, i;
 
-       if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
-           (max_frame > MAX_JUMBO_FRAME_SIZE)) {
-               dev_err(&adapter->pdev->dev, "Invalid MTU setting\n");
+       if ((new_mtu < 68) || (max_frame > MAX_JUMBO_FRAME_SIZE)) {
+               dev_err(&pdev->dev, "Invalid MTU setting\n");
                return -EINVAL;
        }
 
        if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {
-               dev_err(&adapter->pdev->dev, "MTU > 9216 not supported.\n");
+               dev_err(&pdev->dev, "MTU > 9216 not supported.\n");
                return -EINVAL;
        }
 
@@ -3772,6 +3749,7 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu)
 
        /* igb_down has a dependency on max_frame_size */
        adapter->max_frame_size = max_frame;
+
        /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
         * means we reserve 2 more, this pushes us to allocate from the next
         * larger slab size.
@@ -3788,7 +3766,7 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu)
        if (netif_running(netdev))
                igb_down(adapter);
 
-       dev_info(&adapter->pdev->dev, "changing MTU from %d to %d\n",
+       dev_info(&pdev->dev, "changing MTU from %d to %d\n",
                 netdev->mtu, new_mtu);
        netdev->mtu = new_mtu;
 
@@ -3812,10 +3790,13 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu)
 
 void igb_update_stats(struct igb_adapter *adapter)
 {
-       struct net_device *netdev = adapter->netdev;
+       struct net_device_stats *net_stats = igb_get_stats(adapter->netdev);
        struct e1000_hw *hw = &adapter->hw;
        struct pci_dev *pdev = adapter->pdev;
+       u32 rnbc;
        u16 phy_tmp;
+       int i;
+       u64 bytes, packets;
 
 #define PHY_IDLE_ERROR_COUNT_MASK 0x00FF
 
@@ -3828,6 +3809,29 @@ void igb_update_stats(struct igb_adapter *adapter)
        if (pci_channel_offline(pdev))
                return;
 
+       bytes = 0;
+       packets = 0;
+       for (i = 0; i < adapter->num_rx_queues; i++) {
+               u32 rqdpc_tmp = rd32(E1000_RQDPC(i)) & 0x0FFF;
+               adapter->rx_ring[i].rx_stats.drops += rqdpc_tmp;
+               net_stats->rx_fifo_errors += rqdpc_tmp;
+               bytes += adapter->rx_ring[i].rx_stats.bytes;
+               packets += adapter->rx_ring[i].rx_stats.packets;
+       }
+
+       net_stats->rx_bytes = bytes;
+       net_stats->rx_packets = packets;
+
+       bytes = 0;
+       packets = 0;
+       for (i = 0; i < adapter->num_tx_queues; i++) {
+               bytes += adapter->tx_ring[i].tx_stats.bytes;
+               packets += adapter->tx_ring[i].tx_stats.packets;
+       }
+       net_stats->tx_bytes = bytes;
+       net_stats->tx_packets = packets;
+
+       /* read stats registers */
        adapter->stats.crcerrs += rd32(E1000_CRCERRS);
        adapter->stats.gprc += rd32(E1000_GPRC);
        adapter->stats.gorc += rd32(E1000_GORCL);
@@ -3860,7 +3864,9 @@ void igb_update_stats(struct igb_adapter *adapter)
        adapter->stats.gptc += rd32(E1000_GPTC);
        adapter->stats.gotc += rd32(E1000_GOTCL);
        rd32(E1000_GOTCH); /* clear GOTCL */
-       adapter->stats.rnbc += rd32(E1000_RNBC);
+       rnbc = rd32(E1000_RNBC);
+       adapter->stats.rnbc += rnbc;
+       net_stats->rx_fifo_errors += rnbc;
        adapter->stats.ruc += rd32(E1000_RUC);
        adapter->stats.rfc += rd32(E1000_RFC);
        adapter->stats.rjc += rd32(E1000_RJC);
@@ -3879,7 +3885,6 @@ void igb_update_stats(struct igb_adapter *adapter)
        adapter->stats.bptc += rd32(E1000_BPTC);
 
        /* used for adaptive IFS */
-
        hw->mac.tx_packet_delta = rd32(E1000_TPT);
        adapter->stats.tpt += hw->mac.tx_packet_delta;
        hw->mac.collision_delta = rd32(E1000_COLC);
@@ -3902,56 +3907,29 @@ void igb_update_stats(struct igb_adapter *adapter)
        adapter->stats.icrxdmtc += rd32(E1000_ICRXDMTC);
 
        /* Fill out the OS statistics structure */
-       netdev->stats.multicast = adapter->stats.mprc;
-       netdev->stats.collisions = adapter->stats.colc;
+       net_stats->multicast = adapter->stats.mprc;
+       net_stats->collisions = adapter->stats.colc;
 
        /* Rx Errors */
 
-       if (hw->mac.type != e1000_82575) {
-               u32 rqdpc_tmp;
-               u64 rqdpc_total = 0;
-               int i;
-               /* Read out drops stats per RX queue.  Notice RQDPC (Receive
-                * Queue Drop Packet Count) stats only gets incremented, if
-                * the DROP_EN but it set (in the SRRCTL register for that
-                * queue).  If DROP_EN bit is NOT set, then the some what
-                * equivalent count is stored in RNBC (not per queue basis).
-                * Also note the drop count is due to lack of available
-                * descriptors.
-                */
-               for (i = 0; i < adapter->num_rx_queues; i++) {
-                       rqdpc_tmp = rd32(E1000_RQDPC(i)) & 0xFFF;
-                       adapter->rx_ring[i].rx_stats.drops += rqdpc_tmp;
-                       rqdpc_total += adapter->rx_ring[i].rx_stats.drops;
-               }
-               netdev->stats.rx_fifo_errors = rqdpc_total;
-       }
-
-       /* Note RNBC (Receive No Buffers Count) is an not an exact
-        * drop count as the hardware FIFO might save the day.  Thats
-        * one of the reason for saving it in rx_fifo_errors, as its
-        * potentially not a true drop.
-        */
-       netdev->stats.rx_fifo_errors += adapter->stats.rnbc;
-
        /* RLEC on some newer hardware can be incorrect so build
         * our own version based on RUC and ROC */
-       netdev->stats.rx_errors = adapter->stats.rxerrc +
+       net_stats->rx_errors = adapter->stats.rxerrc +
                adapter->stats.crcerrs + adapter->stats.algnerrc +
                adapter->stats.ruc + adapter->stats.roc +
                adapter->stats.cexterr;
-       netdev->stats.rx_length_errors = adapter->stats.ruc +
-                                             adapter->stats.roc;
-       netdev->stats.rx_crc_errors = adapter->stats.crcerrs;
-       netdev->stats.rx_frame_errors = adapter->stats.algnerrc;
-       netdev->stats.rx_missed_errors = adapter->stats.mpc;
+       net_stats->rx_length_errors = adapter->stats.ruc +
+                                     adapter->stats.roc;
+       net_stats->rx_crc_errors = adapter->stats.crcerrs;
+       net_stats->rx_frame_errors = adapter->stats.algnerrc;
+       net_stats->rx_missed_errors = adapter->stats.mpc;
 
        /* Tx Errors */
-       netdev->stats.tx_errors = adapter->stats.ecol +
-                                      adapter->stats.latecol;
-       netdev->stats.tx_aborted_errors = adapter->stats.ecol;
-       netdev->stats.tx_window_errors = adapter->stats.latecol;
-       netdev->stats.tx_carrier_errors = adapter->stats.tncrs;
+       net_stats->tx_errors = adapter->stats.ecol +
+                              adapter->stats.latecol;
+       net_stats->tx_aborted_errors = adapter->stats.ecol;
+       net_stats->tx_window_errors = adapter->stats.latecol;
+       net_stats->tx_carrier_errors = adapter->stats.tncrs;
 
        /* Tx Dropped needs to be maintained elsewhere */
 
@@ -3993,7 +3971,12 @@ static irqreturn_t igb_msix_other(int irq, void *data)
                        mod_timer(&adapter->watchdog_timer, jiffies + 1);
        }
 
-       wr32(E1000_IMS, E1000_IMS_LSC | E1000_IMS_DOUTSYNC | E1000_IMS_VMMB);
+       if (adapter->vfs_allocated_count)
+               wr32(E1000_IMS, E1000_IMS_LSC |
+                               E1000_IMS_VMMB |
+                               E1000_IMS_DOUTSYNC);
+       else
+               wr32(E1000_IMS, E1000_IMS_LSC | E1000_IMS_DOUTSYNC);
        wr32(E1000_EIMS, adapter->eims_other);
 
        return IRQ_HANDLED;
@@ -4097,6 +4080,7 @@ static int __igb_notify_dca(struct device *dev, void *data)
 {
        struct net_device *netdev = dev_get_drvdata(dev);
        struct igb_adapter *adapter = netdev_priv(netdev);
+       struct pci_dev *pdev = adapter->pdev;
        struct e1000_hw *hw = &adapter->hw;
        unsigned long event = *(unsigned long *)data;
 
@@ -4105,12 +4089,9 @@ static int __igb_notify_dca(struct device *dev, void *data)
                /* if already enabled, don't do it again */
                if (adapter->flags & IGB_FLAG_DCA_ENABLED)
                        break;
-               /* Always use CB2 mode, difference is masked
-                * in the CB driver. */
-               wr32(E1000_DCA_CTRL, E1000_DCA_CTRL_DCA_MODE_CB2);
                if (dca_add_requester(dev) == 0) {
                        adapter->flags |= IGB_FLAG_DCA_ENABLED;
-                       dev_info(&adapter->pdev->dev, "DCA enabled\n");
+                       dev_info(&pdev->dev, "DCA enabled\n");
                        igb_setup_dca(adapter);
                        break;
                }
@@ -4120,7 +4101,7 @@ static int __igb_notify_dca(struct device *dev, void *data)
                        /* without this a class_device is left
                         * hanging around in the sysfs model */
                        dca_remove_requester(dev);
-                       dev_info(&adapter->pdev->dev, "DCA disabled\n");
+                       dev_info(&pdev->dev, "DCA disabled\n");
                        adapter->flags &= ~IGB_FLAG_DCA_ENABLED;
                        wr32(E1000_DCA_CTRL, E1000_DCA_CTRL_DCA_MODE_DISABLE);
                }
@@ -4150,12 +4131,51 @@ static void igb_ping_all_vfs(struct igb_adapter *adapter)
 
        for (i = 0 ; i < adapter->vfs_allocated_count; i++) {
                ping = E1000_PF_CONTROL_MSG;
-               if (adapter->vf_data[i].clear_to_send)
+               if (adapter->vf_data[i].flags & IGB_VF_FLAG_CTS)
                        ping |= E1000_VT_MSGTYPE_CTS;
                igb_write_mbx(hw, &ping, 1, i);
        }
 }
 
+static int igb_set_vf_promisc(struct igb_adapter *adapter, u32 *msgbuf, u32 vf)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       u32 vmolr = rd32(E1000_VMOLR(vf));
+       struct vf_data_storage *vf_data = &adapter->vf_data[vf];
+
+       vf_data->flags |= ~(IGB_VF_FLAG_UNI_PROMISC |
+                           IGB_VF_FLAG_MULTI_PROMISC);
+       vmolr &= ~(E1000_VMOLR_ROPE | E1000_VMOLR_ROMPE | E1000_VMOLR_MPME);
+
+       if (*msgbuf & E1000_VF_SET_PROMISC_MULTICAST) {
+               vmolr |= E1000_VMOLR_MPME;
+               *msgbuf &= ~E1000_VF_SET_PROMISC_MULTICAST;
+       } else {
+               /*
+                * if we have hashes and we are clearing a multicast promisc
+                * flag we need to write the hashes to the MTA as this step
+                * was previously skipped
+                */
+               if (vf_data->num_vf_mc_hashes > 30) {
+                       vmolr |= E1000_VMOLR_MPME;
+               } else if (vf_data->num_vf_mc_hashes) {
+                       int j;
+                       vmolr |= E1000_VMOLR_ROMPE;
+                       for (j = 0; j < vf_data->num_vf_mc_hashes; j++)
+                               igb_mta_set(hw, vf_data->vf_mc_hashes[j]);
+               }
+       }
+
+       wr32(E1000_VMOLR(vf), vmolr);
+
+       /* there are flags left unprocessed, likely not supported */
+       if (*msgbuf & E1000_VT_MSGINFO_MASK)
+               return -EINVAL;
+
+       return 0;
+
+}
+
 static int igb_set_vf_multicasts(struct igb_adapter *adapter,
                                  u32 *msgbuf, u32 vf)
 {
@@ -4164,18 +4184,17 @@ static int igb_set_vf_multicasts(struct igb_adapter *adapter,
        struct vf_data_storage *vf_data = &adapter->vf_data[vf];
        int i;
 
-       /* only up to 30 hash values supported */
-       if (n > 30)
-               n = 30;
-
-       /* salt away the number of multi cast addresses assigned
+       /* salt away the number of multicast addresses assigned
         * to this VF for later use to restore when the PF multi cast
         * list changes
         */
        vf_data->num_vf_mc_hashes = n;
 
-       /* VFs are limited to using the MTA hash table for their multicast
-        * addresses */
+       /* only up to 30 hash values supported */
+       if (n > 30)
+               n = 30;
+
+       /* store the hashes for later use */
        for (i = 0; i < n; i++)
                vf_data->vf_mc_hashes[i] = hash_list[i];
 
@@ -4192,9 +4211,20 @@ static void igb_restore_vf_multicasts(struct igb_adapter *adapter)
        int i, j;
 
        for (i = 0; i < adapter->vfs_allocated_count; i++) {
+               u32 vmolr = rd32(E1000_VMOLR(i));
+               vmolr &= ~(E1000_VMOLR_ROMPE | E1000_VMOLR_MPME);
+
                vf_data = &adapter->vf_data[i];
-               for (j = 0; j < vf_data->num_vf_mc_hashes; j++)
-                       igb_mta_set(hw, vf_data->vf_mc_hashes[j]);
+
+               if ((vf_data->num_vf_mc_hashes > 30) ||
+                   (vf_data->flags & IGB_VF_FLAG_MULTI_PROMISC)) {
+                       vmolr |= E1000_VMOLR_MPME;
+               } else if (vf_data->num_vf_mc_hashes) {
+                       vmolr |= E1000_VMOLR_ROMPE;
+                       for (j = 0; j < vf_data->num_vf_mc_hashes; j++)
+                               igb_mta_set(hw, vf_data->vf_mc_hashes[j]);
+               }
+               wr32(E1000_VMOLR(i), vmolr);
        }
 }
 
@@ -4232,7 +4262,11 @@ static s32 igb_vlvf_set(struct igb_adapter *adapter, u32 vid, bool add, u32 vf)
        struct e1000_hw *hw = &adapter->hw;
        u32 reg, i;
 
-       /* It is an error to call this function when VFs are not enabled */
+       /* The vlvf table only exists on 82576 hardware and newer */
+       if (hw->mac.type < e1000_82576)
+               return -1;
+
+       /* we only need to do this if VMDq is enabled */
        if (!adapter->vfs_allocated_count)
                return -1;
 
@@ -4262,16 +4296,12 @@ static s32 igb_vlvf_set(struct igb_adapter *adapter, u32 vid, bool add, u32 vf)
 
                        /* if !enabled we need to set this up in vfta */
                        if (!(reg & E1000_VLVF_VLANID_ENABLE)) {
-                               /* add VID to filter table, if bit already set
-                                * PF must have added it outside of table */
-                               if (igb_vfta_set(hw, vid, true))
-                                       reg |= 1 << (E1000_VLVF_POOLSEL_SHIFT +
-                                               adapter->vfs_allocated_count);
+                               /* add VID to filter table */
+                               igb_vfta_set(hw, vid, true);
                                reg |= E1000_VLVF_VLANID_ENABLE;
                        }
                        reg &= ~E1000_VLVF_VLANID_MASK;
                        reg |= vid;
-
                        wr32(E1000_VLVF(i), reg);
 
                        /* do not modify RLPML for PF devices */
@@ -4287,8 +4317,8 @@ static s32 igb_vlvf_set(struct igb_adapter *adapter, u32 vid, bool add, u32 vf)
                                reg |= size;
                                wr32(E1000_VMOLR(vf), reg);
                        }
-                       adapter->vf_data[vf].vlans_enabled++;
 
+                       adapter->vf_data[vf].vlans_enabled++;
                        return 0;
                }
        } else {
@@ -4330,15 +4360,14 @@ static int igb_set_vf_vlan(struct igb_adapter *adapter, u32 *msgbuf, u32 vf)
        return igb_vlvf_set(adapter, vid, add, vf);
 }
 
-static inline void igb_vf_reset_event(struct igb_adapter *adapter, u32 vf)
+static inline void igb_vf_reset(struct igb_adapter *adapter, u32 vf)
 {
-       struct e1000_hw *hw = &adapter->hw;
-
-       /* disable mailbox functionality for vf */
-       adapter->vf_data[vf].clear_to_send = false;
+       /* clear all flags */
+       adapter->vf_data[vf].flags = 0;
+       adapter->vf_data[vf].last_nack = jiffies;
 
        /* reset offloads to defaults */
-       igb_set_vmolr(hw, vf);
+       igb_set_vmolr(adapter, vf);
 
        /* reset vlans for device */
        igb_clear_vf_vfta(adapter, vf);
@@ -4350,7 +4379,18 @@ static inline void igb_vf_reset_event(struct igb_adapter *adapter, u32 vf)
        igb_set_rx_mode(adapter->netdev);
 }
 
-static inline void igb_vf_reset_msg(struct igb_adapter *adapter, u32 vf)
+static void igb_vf_reset_event(struct igb_adapter *adapter, u32 vf)
+{
+       unsigned char *vf_mac = adapter->vf_data[vf].vf_mac_addresses;
+
+       /* generate a new mac address as we were hotplug removed/added */
+       random_ether_addr(vf_mac);
+
+       /* process remaining reset events */
+       igb_vf_reset(adapter, vf);
+}
+
+static void igb_vf_reset_msg(struct igb_adapter *adapter, u32 vf)
 {
        struct e1000_hw *hw = &adapter->hw;
        unsigned char *vf_mac = adapter->vf_data[vf].vf_mac_addresses;
@@ -4359,7 +4399,7 @@ static inline void igb_vf_reset_msg(struct igb_adapter *adapter, u32 vf)
        u8 *addr = (u8 *)(&msgbuf[1]);
 
        /* process all the same items cleared in a function level reset */
-       igb_vf_reset_event(adapter, vf);
+       igb_vf_reset(adapter, vf);
 
        /* set vf mac address */
        igb_rar_set_qsel(adapter, vf_mac, rar_entry, vf);
@@ -4370,8 +4410,7 @@ static inline void igb_vf_reset_msg(struct igb_adapter *adapter, u32 vf)
        reg = rd32(E1000_VFRE);
        wr32(E1000_VFRE, reg | (1 << vf));
 
-       /* enable mailbox functionality for vf */
-       adapter->vf_data[vf].clear_to_send = true;
+       adapter->vf_data[vf].flags = IGB_VF_FLAG_CTS;
 
        /* reply to reset with ack and vf mac address */
        msgbuf[0] = E1000_VF_RESET | E1000_VT_MSGTYPE_ACK;
@@ -4381,66 +4420,45 @@ static inline void igb_vf_reset_msg(struct igb_adapter *adapter, u32 vf)
 
 static int igb_set_vf_mac_addr(struct igb_adapter *adapter, u32 *msg, int vf)
 {
-               unsigned char *addr = (char *)&msg[1];
-               int err = -1;
+       unsigned char *addr = (char *)&msg[1];
+       int err = -1;
 
-               if (is_valid_ether_addr(addr))
-                       err = igb_set_vf_mac(adapter, vf, addr);
-
-               return err;
+       if (is_valid_ether_addr(addr))
+               err = igb_set_vf_mac(adapter, vf, addr);
 
+       return err;
 }
 
 static void igb_rcv_ack_from_vf(struct igb_adapter *adapter, u32 vf)
 {
        struct e1000_hw *hw = &adapter->hw;
+       struct vf_data_storage *vf_data = &adapter->vf_data[vf];
        u32 msg = E1000_VT_MSGTYPE_NACK;
 
        /* if device isn't clear to send it shouldn't be reading either */
-       if (!adapter->vf_data[vf].clear_to_send)
+       if (!(vf_data->flags & IGB_VF_FLAG_CTS) &&
+           time_after(jiffies, vf_data->last_nack + (2 * HZ))) {
                igb_write_mbx(hw, &msg, 1, vf);
-}
-
-
-static void igb_msg_task(struct igb_adapter *adapter)
-{
-       struct e1000_hw *hw = &adapter->hw;
-       u32 vf;
-
-       for (vf = 0; vf < adapter->vfs_allocated_count; vf++) {
-               /* process any reset requests */
-               if (!igb_check_for_rst(hw, vf)) {
-                       adapter->vf_data[vf].clear_to_send = false;
-                       igb_vf_reset_event(adapter, vf);
-               }
-
-               /* process any messages pending */
-               if (!igb_check_for_msg(hw, vf))
-                       igb_rcv_msg_from_vf(adapter, vf);
-
-               /* process any acks */
-               if (!igb_check_for_ack(hw, vf))
-                       igb_rcv_ack_from_vf(adapter, vf);
-
+               vf_data->last_nack = jiffies;
        }
 }
 
-static int igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
+static void igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
 {
-       u32 mbx_size = E1000_VFMAILBOX_SIZE;
-       u32 msgbuf[mbx_size];
+       struct pci_dev *pdev = adapter->pdev;
+       u32 msgbuf[E1000_VFMAILBOX_SIZE];
        struct e1000_hw *hw = &adapter->hw;
+       struct vf_data_storage *vf_data = &adapter->vf_data[vf];
        s32 retval;
 
-       retval = igb_read_mbx(hw, msgbuf, mbx_size, vf);
+       retval = igb_read_mbx(hw, msgbuf, E1000_VFMAILBOX_SIZE, vf);
 
        if (retval)
-               dev_err(&adapter->pdev->dev,
-                       "Error receiving message from VF\n");
+               dev_err(&pdev->dev, "Error receiving message from VF\n");
 
        /* this is a message we already processed, do nothing */
        if (msgbuf[0] & (E1000_VT_MSGTYPE_ACK | E1000_VT_MSGTYPE_NACK))
-               return retval;
+               return;
 
        /*
         * until the vf completes a reset it should not be
@@ -4449,20 +4467,25 @@ static int igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
 
        if (msgbuf[0] == E1000_VF_RESET) {
                igb_vf_reset_msg(adapter, vf);
-
-               return retval;
+               return;
        }
 
-       if (!adapter->vf_data[vf].clear_to_send) {
-               msgbuf[0] |= E1000_VT_MSGTYPE_NACK;
-               igb_write_mbx(hw, msgbuf, 1, vf);
-               return retval;
+       if (!(vf_data->flags & IGB_VF_FLAG_CTS)) {
+               msgbuf[0] = E1000_VT_MSGTYPE_NACK;
+               if (time_after(jiffies, vf_data->last_nack + (2 * HZ))) {
+                       igb_write_mbx(hw, msgbuf, 1, vf);
+                       vf_data->last_nack = jiffies;
+               }
+               return;
        }
 
        switch ((msgbuf[0] & 0xFFFF)) {
        case E1000_VF_SET_MAC_ADDR:
                retval = igb_set_vf_mac_addr(adapter, msgbuf, vf);
                break;
+       case E1000_VF_SET_PROMISC:
+               retval = igb_set_vf_promisc(adapter, msgbuf, vf);
+               break;
        case E1000_VF_SET_MULTICAST:
                retval = igb_set_vf_multicasts(adapter, msgbuf, vf);
                break;
@@ -4473,7 +4496,7 @@ static int igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
                retval = igb_set_vf_vlan(adapter, msgbuf, vf);
                break;
        default:
-               dev_err(&adapter->pdev->dev, "Unhandled Msg %08x\n", msgbuf[0]);
+               dev_err(&pdev->dev, "Unhandled Msg %08x\n", msgbuf[0]);
                retval = -1;
                break;
        }
@@ -4487,8 +4510,26 @@ static int igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
        msgbuf[0] |= E1000_VT_MSGTYPE_CTS;
 
        igb_write_mbx(hw, msgbuf, 1, vf);
+}
 
-       return retval;
+static void igb_msg_task(struct igb_adapter *adapter)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       u32 vf;
+
+       for (vf = 0; vf < adapter->vfs_allocated_count; vf++) {
+               /* process any reset requests */
+               if (!igb_check_for_rst(hw, vf))
+                       igb_vf_reset_event(adapter, vf);
+
+               /* process any messages pending */
+               if (!igb_check_for_msg(hw, vf))
+                       igb_rcv_msg_from_vf(adapter, vf);
+
+               /* process any acks */
+               if (!igb_check_for_ack(hw, vf))
+                       igb_rcv_ack_from_vf(adapter, vf);
+       }
 }
 
 /**
@@ -4594,7 +4635,8 @@ static inline void igb_ring_irq_enable(struct igb_q_vector *q_vector)
        struct igb_adapter *adapter = q_vector->adapter;
        struct e1000_hw *hw = &adapter->hw;
 
-       if (adapter->itr_setting & 3) {
+       if ((q_vector->rx_ring && (adapter->rx_itr_setting & 3)) ||
+           (!q_vector->rx_ring && (adapter->tx_itr_setting & 3))) {
                if (!adapter->msix_entries)
                        igb_set_itr(adapter);
                else
@@ -4644,37 +4686,54 @@ static int igb_poll(struct napi_struct *napi, int budget)
 }
 
 /**
- * igb_hwtstamp - utility function which checks for TX time stamp
+ * igb_systim_to_hwtstamp - convert system time value to hw timestamp
  * @adapter: board private structure
+ * @shhwtstamps: timestamp structure to update
+ * @regval: unsigned 64bit system time value.
+ *
+ * We need to convert the system time value stored in the RX/TXSTMP registers
+ * into a hwtstamp which can be used by the upper level timestamping functions
+ */
+static void igb_systim_to_hwtstamp(struct igb_adapter *adapter,
+                                   struct skb_shared_hwtstamps *shhwtstamps,
+                                   u64 regval)
+{
+       u64 ns;
+
+       ns = timecounter_cyc2time(&adapter->clock, regval);
+       timecompare_update(&adapter->compare, ns);
+       memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
+       shhwtstamps->hwtstamp = ns_to_ktime(ns);
+       shhwtstamps->syststamp = timecompare_transform(&adapter->compare, ns);
+}
+
+/**
+ * igb_tx_hwtstamp - utility function which checks for TX time stamp
+ * @q_vector: pointer to q_vector containing needed info
  * @skb: packet that was just sent
  *
  * If we were asked to do hardware stamping and such a time stamp is
  * available, then it must have been for this skb here because we only
  * allow only one such packet into the queue.
  */
-static void igb_tx_hwtstamp(struct igb_adapter *adapter, struct sk_buff *skb)
+static void igb_tx_hwtstamp(struct igb_q_vector *q_vector, struct sk_buff *skb)
 {
+       struct igb_adapter *adapter = q_vector->adapter;
        union skb_shared_tx *shtx = skb_tx(skb);
        struct e1000_hw *hw = &adapter->hw;
+       struct skb_shared_hwtstamps shhwtstamps;
+       u64 regval;
 
-       if (unlikely(shtx->hardware)) {
-               u32 valid = rd32(E1000_TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID;
-               if (valid) {
-                       u64 regval = rd32(E1000_TXSTMPL);
-                       u64 ns;
-                       struct skb_shared_hwtstamps shhwtstamps;
-
-                       memset(&shhwtstamps, 0, sizeof(shhwtstamps));
-                       regval |= (u64)rd32(E1000_TXSTMPH) << 32;
-                       ns = timecounter_cyc2time(&adapter->clock,
-                                                 regval);
-                       timecompare_update(&adapter->compare, ns);
-                       shhwtstamps.hwtstamp = ns_to_ktime(ns);
-                       shhwtstamps.syststamp =
-                               timecompare_transform(&adapter->compare, ns);
-                       skb_tstamp_tx(skb, &shhwtstamps);
-               }
-       }
+       /* if skb does not support hw timestamp or TX stamp not valid exit */
+       if (likely(!shtx->hardware) ||
+           !(rd32(E1000_TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID))
+               return;
+
+       regval = rd32(E1000_TXSTMPL);
+       regval |= (u64)rd32(E1000_TXSTMPH) << 32;
+
+       igb_systim_to_hwtstamp(adapter, &shhwtstamps, regval);
+       skb_tstamp_tx(skb, &shhwtstamps);
 }
 
 /**
@@ -4717,7 +4776,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
                                total_packets += segs;
                                total_bytes += bytecount;
 
-                               igb_tx_hwtstamp(adapter, skb);
+                               igb_tx_hwtstamp(q_vector, skb);
                        }
 
                        igb_unmap_and_free_tx_resource(tx_ring, buffer_info);
@@ -4775,7 +4834,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
                                readl(tx_ring->tail),
                                tx_ring->next_to_use,
                                tx_ring->next_to_clean,
-                               tx_ring->buffer_info[i].time_stamp,
+                               tx_ring->buffer_info[eop].time_stamp,
                                eop,
                                jiffies,
                                eop_desc->wb.status);
@@ -4786,8 +4845,6 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
        tx_ring->total_packets += total_packets;
        tx_ring->tx_stats.bytes += total_bytes;
        tx_ring->tx_stats.packets += total_packets;
-       netdev->stats.tx_bytes += total_bytes;
-       netdev->stats.tx_packets += total_packets;
        return (count < tx_ring->count);
 }
 
@@ -4842,6 +4899,34 @@ static inline void igb_rx_checksum_adv(struct igb_ring *ring,
        dev_dbg(&ring->pdev->dev, "cksum success: bits %08X\n", status_err);
 }
 
+static inline void igb_rx_hwtstamp(struct igb_q_vector *q_vector, u32 staterr,
+                                   struct sk_buff *skb)
+{
+       struct igb_adapter *adapter = q_vector->adapter;
+       struct e1000_hw *hw = &adapter->hw;
+       u64 regval;
+
+       /*
+        * If this bit is set, then the RX registers contain the time stamp. No
+        * other packet will be time stamped until we read these registers, so
+        * read the registers to make them available again. Because only one
+        * packet can be time stamped at a time, we know that the register
+        * values must belong to this one here and therefore we don't need to
+        * compare any of the additional attributes stored for it.
+        *
+        * If nothing went wrong, then it should have a skb_shared_tx that we
+        * can turn into a skb_shared_hwtstamps.
+        */
+       if (likely(!(staterr & E1000_RXDADV_STAT_TS)))
+               return;
+       if (!(rd32(E1000_TSYNCRXCTL) & E1000_TSYNCRXCTL_VALID))
+               return;
+
+       regval = rd32(E1000_RXSTMPL);
+       regval |= (u64)rd32(E1000_RXSTMPH) << 32;
+
+       igb_systim_to_hwtstamp(adapter, skb_hwtstamps(skb), regval);
+}
 static inline u16 igb_get_hlen(struct igb_ring *rx_ring,
                                union e1000_adv_rx_desc *rx_desc)
 {
@@ -4859,16 +4944,15 @@ static inline u16 igb_get_hlen(struct igb_ring *rx_ring,
 static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,
                                  int *work_done, int budget)
 {
-       struct igb_adapter *adapter = q_vector->adapter;
        struct igb_ring *rx_ring = q_vector->rx_ring;
        struct net_device *netdev = rx_ring->netdev;
-       struct e1000_hw *hw = &adapter->hw;
        struct pci_dev *pdev = rx_ring->pdev;
        union e1000_adv_rx_desc *rx_desc , *next_rxd;
        struct igb_buffer *buffer_info , *next_buffer;
        struct sk_buff *skb;
        bool cleaned = false;
        int cleaned_count = 0;
+       int current_node = numa_node_id();
        unsigned int total_bytes = 0, total_packets = 0;
        unsigned int i;
        u32 staterr;
@@ -4892,6 +4976,7 @@ static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,
                i++;
                if (i == rx_ring->count)
                        i = 0;
+
                next_rxd = E1000_RX_DESC_ADV(*rx_ring, i);
                prefetch(next_rxd);
                next_buffer = &rx_ring->buffer_info[i];
@@ -4922,14 +5007,14 @@ static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,
                                                buffer_info->page_offset,
                                                length);
 
-                       if (page_count(buffer_info->page) != 1)
+                       if ((page_count(buffer_info->page) != 1) ||
+                           (page_to_nid(buffer_info->page) != current_node))
                                buffer_info->page = NULL;
                        else
                                get_page(buffer_info->page);
 
                        skb->len += length;
                        skb->data_len += length;
-
                        skb->truesize += length;
                }
 
@@ -4941,52 +5026,12 @@ static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,
                        goto next_desc;
                }
 send_up:
-               /*
-                * If this bit is set, then the RX registers contain
-                * the time stamp. No other packet will be time
-                * stamped until we read these registers, so read the
-                * registers to make them available again. Because
-                * only one packet can be time stamped at a time, we
-                * know that the register values must belong to this
-                * one here and therefore we don't need to compare
-                * any of the additional attributes stored for it.
-                *
-                * If nothing went wrong, then it should have a
-                * skb_shared_tx that we can turn into a
-                * skb_shared_hwtstamps.
-                *
-                * TODO: can time stamping be triggered (thus locking
-                * the registers) without the packet reaching this point
-                * here? In that case RX time stamping would get stuck.
-                *
-                * TODO: in "time stamp all packets" mode this bit is
-                * not set. Need a global flag for this mode and then
-                * always read the registers. Cannot be done without
-                * a race condition.
-                */
-               if (unlikely(staterr & E1000_RXD_STAT_TS)) {
-                       u64 regval;
-                       u64 ns;
-                       struct skb_shared_hwtstamps *shhwtstamps =
-                               skb_hwtstamps(skb);
-
-                       WARN(!(rd32(E1000_TSYNCRXCTL) & E1000_TSYNCRXCTL_VALID),
-                            "igb: no RX time stamp available for time stamped packet");
-                       regval = rd32(E1000_RXSTMPL);
-                       regval |= (u64)rd32(E1000_RXSTMPH) << 32;
-                       ns = timecounter_cyc2time(&adapter->clock, regval);
-                       timecompare_update(&adapter->compare, ns);
-                       memset(shhwtstamps, 0, sizeof(*shhwtstamps));
-                       shhwtstamps->hwtstamp = ns_to_ktime(ns);
-                       shhwtstamps->syststamp =
-                               timecompare_transform(&adapter->compare, ns);
-               }
-
                if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) {
                        dev_kfree_skb_irq(skb);
                        goto next_desc;
                }
 
+               igb_rx_hwtstamp(q_vector, staterr, skb);
                total_bytes += skb->len;
                total_packets++;
 
@@ -5025,8 +5070,6 @@ next_desc:
        rx_ring->total_bytes += total_bytes;
        rx_ring->rx_stats.packets += total_packets;
        rx_ring->rx_stats.bytes += total_bytes;
-       netdev->stats.rx_bytes += total_bytes;
-       netdev->stats.rx_packets += total_packets;
        return cleaned;
 }
 
@@ -5034,8 +5077,7 @@ next_desc:
  * igb_alloc_rx_buffers_adv - Replace used receive buffers; packet split
  * @adapter: address of board private structure
  **/
-static void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring,
-                                    int cleaned_count)
+void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, int cleaned_count)
 {
        struct net_device *netdev = rx_ring->netdev;
        union e1000_adv_rx_desc *rx_desc;
@@ -5054,7 +5096,7 @@ static void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring,
 
                if ((bufsz < IGB_RXBUFFER_1024) && !buffer_info->page_dma) {
                        if (!buffer_info->page) {
-                               buffer_info->page = alloc_page(GFP_ATOMIC);
+                               buffer_info->page = netdev_alloc_page(netdev);
                                if (!buffer_info->page) {
                                        rx_ring->rx_stats.alloc_failed++;
                                        goto no_buffers;
@@ -5068,9 +5110,16 @@ static void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring,
                                             buffer_info->page_offset,
                                             PAGE_SIZE / 2,
                                             PCI_DMA_FROMDEVICE);
+                       if (pci_dma_mapping_error(rx_ring->pdev,
+                                                 buffer_info->page_dma)) {
+                               buffer_info->page_dma = 0;
+                               rx_ring->rx_stats.alloc_failed++;
+                               goto no_buffers;
+                       }
                }
 
-               if (!buffer_info->skb) {
+               skb = buffer_info->skb;
+               if (!skb) {
                        skb = netdev_alloc_skb_ip_align(netdev, bufsz);
                        if (!skb) {
                                rx_ring->rx_stats.alloc_failed++;
@@ -5078,10 +5127,18 @@ static void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring,
                        }
 
                        buffer_info->skb = skb;
+               }
+               if (!buffer_info->dma) {
                        buffer_info->dma = pci_map_single(rx_ring->pdev,
                                                          skb->data,
                                                          bufsz,
                                                          PCI_DMA_FROMDEVICE);
+                       if (pci_dma_mapping_error(rx_ring->pdev,
+                                                 buffer_info->dma)) {
+                               buffer_info->dma = 0;
+                               rx_ring->rx_stats.alloc_failed++;
+                               goto no_buffers;
+                       }
                }
                /* Refresh the desc even if buffer_addrs didn't change because
                 * each write-back erases this info. */
@@ -5090,8 +5147,7 @@ static void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring,
                             cpu_to_le64(buffer_info->page_dma);
                        rx_desc->read.hdr_addr = cpu_to_le64(buffer_info->dma);
                } else {
-                       rx_desc->read.pkt_addr =
-                            cpu_to_le64(buffer_info->dma);
+                       rx_desc->read.pkt_addr = cpu_to_le64(buffer_info->dma);
                        rx_desc->read.hdr_addr = 0;
                }
 
@@ -5173,13 +5229,11 @@ static int igb_hwtstamp_ioctl(struct net_device *netdev,
        struct igb_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
        struct hwtstamp_config config;
-       u32 tsync_tx_ctl_bit = E1000_TSYNCTXCTL_ENABLED;
-       u32 tsync_rx_ctl_bit = E1000_TSYNCRXCTL_ENABLED;
-       u32 tsync_rx_ctl_type = 0;
+       u32 tsync_tx_ctl = E1000_TSYNCTXCTL_ENABLED;
+       u32 tsync_rx_ctl = E1000_TSYNCRXCTL_ENABLED;
        u32 tsync_rx_cfg = 0;
-       int is_l4 = 0;
-       int is_l2 = 0;
-       short port = 319; /* PTP */
+       bool is_l4 = false;
+       bool is_l2 = false;
        u32 regval;
 
        if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
@@ -5191,10 +5245,8 @@ static int igb_hwtstamp_ioctl(struct net_device *netdev,
 
        switch (config.tx_type) {
        case HWTSTAMP_TX_OFF:
-               tsync_tx_ctl_bit = 0;
-               break;
+               tsync_tx_ctl = 0;
        case HWTSTAMP_TX_ON:
-               tsync_tx_ctl_bit = E1000_TSYNCTXCTL_ENABLED;
                break;
        default:
                return -ERANGE;
@@ -5202,7 +5254,7 @@ static int igb_hwtstamp_ioctl(struct net_device *netdev,
 
        switch (config.rx_filter) {
        case HWTSTAMP_FILTER_NONE:
-               tsync_rx_ctl_bit = 0;
+               tsync_rx_ctl = 0;
                break;
        case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
        case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
@@ -5213,86 +5265,97 @@ static int igb_hwtstamp_ioctl(struct net_device *netdev,
                 * possible to time stamp both Sync and Delay_Req messages
                 * => fall back to time stamping all packets
                 */
-               tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_ALL;
+               tsync_rx_ctl |= E1000_TSYNCRXCTL_TYPE_ALL;
                config.rx_filter = HWTSTAMP_FILTER_ALL;
                break;
        case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
-               tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_L4_V1;
+               tsync_rx_ctl |= E1000_TSYNCRXCTL_TYPE_L4_V1;
                tsync_rx_cfg = E1000_TSYNCRXCFG_PTP_V1_SYNC_MESSAGE;
-               is_l4 = 1;
+               is_l4 = true;
                break;
        case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
-               tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_L4_V1;
+               tsync_rx_ctl |= E1000_TSYNCRXCTL_TYPE_L4_V1;
                tsync_rx_cfg = E1000_TSYNCRXCFG_PTP_V1_DELAY_REQ_MESSAGE;
-               is_l4 = 1;
+               is_l4 = true;
                break;
        case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
-               tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_L2_L4_V2;
+               tsync_rx_ctl |= E1000_TSYNCRXCTL_TYPE_L2_L4_V2;
                tsync_rx_cfg = E1000_TSYNCRXCFG_PTP_V2_SYNC_MESSAGE;
-               is_l2 = 1;
-               is_l4 = 1;
+               is_l2 = true;
+               is_l4 = true;
                config.rx_filter = HWTSTAMP_FILTER_SOME;
                break;
        case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
        case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
-               tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_L2_L4_V2;
+               tsync_rx_ctl |= E1000_TSYNCRXCTL_TYPE_L2_L4_V2;
                tsync_rx_cfg = E1000_TSYNCRXCFG_PTP_V2_DELAY_REQ_MESSAGE;
-               is_l2 = 1;
-               is_l4 = 1;
+               is_l2 = true;
+               is_l4 = true;
                config.rx_filter = HWTSTAMP_FILTER_SOME;
                break;
        case HWTSTAMP_FILTER_PTP_V2_EVENT:
        case HWTSTAMP_FILTER_PTP_V2_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
-               tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_EVENT_V2;
+               tsync_rx_ctl |= E1000_TSYNCRXCTL_TYPE_EVENT_V2;
                config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
-               is_l2 = 1;
+               is_l2 = true;
                break;
        default:
                return -ERANGE;
        }
 
+       if (hw->mac.type == e1000_82575) {
+               if (tsync_rx_ctl | tsync_tx_ctl)
+                       return -EINVAL;
+               return 0;
+       }
+
        /* enable/disable TX */
        regval = rd32(E1000_TSYNCTXCTL);
-       regval = (regval & ~E1000_TSYNCTXCTL_ENABLED) | tsync_tx_ctl_bit;
+       regval &= ~E1000_TSYNCTXCTL_ENABLED;
+       regval |= tsync_tx_ctl;
        wr32(E1000_TSYNCTXCTL, regval);
 
-       /* enable/disable RX, define which PTP packets are time stamped */
+       /* enable/disable RX */
        regval = rd32(E1000_TSYNCRXCTL);
-       regval = (regval & ~E1000_TSYNCRXCTL_ENABLED) | tsync_rx_ctl_bit;
-       regval = (regval & ~0xE) | tsync_rx_ctl_type;
+       regval &= ~(E1000_TSYNCRXCTL_ENABLED | E1000_TSYNCRXCTL_TYPE_MASK);
+       regval |= tsync_rx_ctl;
        wr32(E1000_TSYNCRXCTL, regval);
-       wr32(E1000_TSYNCRXCFG, tsync_rx_cfg);
 
-       /*
-        * Ethertype Filter Queue Filter[0][15:0] = 0x88F7
-        *                                          (Ethertype to filter on)
-        * Ethertype Filter Queue Filter[0][26] = 0x1 (Enable filter)
-        * Ethertype Filter Queue Filter[0][30] = 0x1 (Enable Timestamping)
-        */
-       wr32(E1000_ETQF0, is_l2 ? 0x440088f7 : 0);
-
-       /* L4 Queue Filter[0]: only filter by source and destination port */
-       wr32(E1000_SPQF0, htons(port));
-       wr32(E1000_IMIREXT(0), is_l4 ?
-            ((1<<12) | (1<<19) /* bypass size and control flags */) : 0);
-       wr32(E1000_IMIR(0), is_l4 ?
-            (htons(port)
-             | (0<<16) /* immediate interrupt disabled */
-             | 0 /* (1<<17) bit cleared: do not bypass
-                    destination port check */)
-               : 0);
-       wr32(E1000_FTQF0, is_l4 ?
-            (0x11 /* UDP */
-             | (1<<15) /* VF not compared */
-             | (1<<27) /* Enable Timestamping */
-             | (7<<28) /* only source port filter enabled,
-                          source/target address and protocol
-                          masked */)
-            : ((1<<15) | (15<<28) /* all mask bits set = filter not
-                                     enabled */));
+       /* define which PTP packets are time stamped */
+       wr32(E1000_TSYNCRXCFG, tsync_rx_cfg);
 
+       /* define ethertype filter for timestamped packets */
+       if (is_l2)
+               wr32(E1000_ETQF(3),
+                               (E1000_ETQF_FILTER_ENABLE | /* enable filter */
+                                E1000_ETQF_1588 | /* enable timestamping */
+                                ETH_P_1588));     /* 1588 eth protocol type */
+       else
+               wr32(E1000_ETQF(3), 0);
+
+#define PTP_PORT 319
+       /* L4 Queue Filter[3]: filter by destination port and protocol */
+       if (is_l4) {
+               u32 ftqf = (IPPROTO_UDP /* UDP */
+                       | E1000_FTQF_VF_BP /* VF not compared */
+                       | E1000_FTQF_1588_TIME_STAMP /* Enable Timestamping */
+                       | E1000_FTQF_MASK); /* mask all inputs */
+               ftqf &= ~E1000_FTQF_MASK_PROTO_BP; /* enable protocol check */
+
+               wr32(E1000_IMIR(3), htons(PTP_PORT));
+               wr32(E1000_IMIREXT(3),
+                    (E1000_IMIREXT_SIZE_BP | E1000_IMIREXT_CTRL_BP));
+               if (hw->mac.type == e1000_82576) {
+                       /* enable source port check */
+                       wr32(E1000_SPQF(3), htons(PTP_PORT));
+                       ftqf &= ~E1000_FTQF_MASK_SOURCE_PORT_BP;
+               }
+               wr32(E1000_FTQF(3), ftqf);
+       } else {
+               wr32(E1000_FTQF(3), E1000_FTQF_MASK);
+       }
        wrfl();
 
        adapter->hwtstamp_config = config;
@@ -5369,21 +5432,15 @@ static void igb_vlan_rx_register(struct net_device *netdev,
                ctrl |= E1000_CTRL_VME;
                wr32(E1000_CTRL, ctrl);
 
-               /* enable VLAN receive filtering */
+               /* Disable CFI check */
                rctl = rd32(E1000_RCTL);
                rctl &= ~E1000_RCTL_CFIEN;
                wr32(E1000_RCTL, rctl);
-               igb_update_mng_vlan(adapter);
        } else {
                /* disable VLAN tag insert/strip */
                ctrl = rd32(E1000_CTRL);
                ctrl &= ~E1000_CTRL_VME;
                wr32(E1000_CTRL, ctrl);
-
-               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;
-               }
        }
 
        igb_rlpml_set(adapter);
@@ -5398,16 +5455,11 @@ static void igb_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
        struct e1000_hw *hw = &adapter->hw;
        int pf_id = adapter->vfs_allocated_count;
 
-       if ((hw->mng_cookie.status &
-            E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
-           (vid == adapter->mng_vlan_id))
-               return;
-
-       /* add vid to vlvf if sr-iov is enabled,
-        * if that fails add directly to filter table */
-       if (igb_vlvf_set(adapter, vid, true, pf_id))
-               igb_vfta_set(hw, vid, true);
+       /* attempt to add filter to vlvf array */
+       igb_vlvf_set(adapter, vid, true, pf_id);
 
+       /* add the filter since PF can receive vlans w/o entry in vlvf */
+       igb_vfta_set(hw, vid, true);
 }
 
 static void igb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
@@ -5415,6 +5467,7 @@ static void igb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
        struct igb_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
        int pf_id = adapter->vfs_allocated_count;
+       s32 err;
 
        igb_irq_disable(adapter);
        vlan_group_set_device(adapter->vlgrp, vid, NULL);
@@ -5422,17 +5475,11 @@ static void igb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
        if (!test_bit(__IGB_DOWN, &adapter->state))
                igb_irq_enable(adapter);
 
-       if ((adapter->hw.mng_cookie.status &
-            E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
-           (vid == adapter->mng_vlan_id)) {
-               /* release control to f/w */
-               igb_release_hw_control(adapter);
-               return;
-       }
+       /* remove vlan from VLVF table array */
+       err = igb_vlvf_set(adapter, vid, false, pf_id);
 
-       /* remove vid from vlvf if sr-iov is enabled,
-        * if not in vlvf remove from vfta */
-       if (igb_vlvf_set(adapter, vid, false, pf_id))
+       /* if vid was not present in VLVF just remove it from table */
+       if (err)
                igb_vfta_set(hw, vid, false);
 }
 
@@ -5452,6 +5499,7 @@ static void igb_restore_vlan(struct igb_adapter *adapter)
 
 int igb_set_spd_dplx(struct igb_adapter *adapter, u16 spddplx)
 {
+       struct pci_dev *pdev = adapter->pdev;
        struct e1000_mac_info *mac = &adapter->hw.mac;
 
        mac->autoneg = 0;
@@ -5475,8 +5523,7 @@ int igb_set_spd_dplx(struct igb_adapter *adapter, u16 spddplx)
                break;
        case SPEED_1000 + DUPLEX_HALF: /* not supported */
        default:
-               dev_err(&adapter->pdev->dev,
-                       "Unsupported Speed/Duplex configuration\n");
+               dev_err(&pdev->dev, "Unsupported Speed/Duplex configuration\n");
                return -EINVAL;
        }
        return 0;
@@ -5530,7 +5577,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake)
                wr32(E1000_CTRL, ctrl);
 
                /* Allow time for pending master requests to run */
-               igb_disable_pcie_master(&adapter->hw);
+               igb_disable_pcie_master(hw);
 
                wr32(E1000_WUC, E1000_WUC_PME_EN);
                wr32(E1000_WUFC, wufc);
@@ -5799,11 +5846,22 @@ static int igb_set_vf_mac(struct igb_adapter *adapter,
 static void igb_vmm_control(struct igb_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
+       u32 reg;
 
        /* replication is not supported for 82575 */
        if (hw->mac.type == e1000_82575)
                return;
 
+       /* enable replication vlan tag stripping */
+       reg = rd32(E1000_RPLOLR);
+       reg |= E1000_RPLOLR_STRVLAN;
+       wr32(E1000_RPLOLR, reg);
+
+       /* notify HW that the MAC is adding vlan tags */
+       reg = rd32(E1000_DTXCTL);
+       reg |= E1000_DTXCTL_VLAN_ADDED;
+       wr32(E1000_DTXCTL, reg);
+
        if (adapter->vfs_allocated_count) {
                igb_vmdq_set_loopback_pf(hw, true);
                igb_vmdq_set_replication_pf(hw, true);
This page took 0.068465 seconds and 5 git commands to generate.