net: convert multicast list to list_head
[safe/jmp/linux-2.6] / drivers / net / igb / igb_main.c
index 62b6876..78cc742 100644 (file)
@@ -49,7 +49,7 @@
 #endif
 #include "igb.h"
 
-#define DRV_VERSION "1.3.16-k2"
+#define DRV_VERSION "2.1.0-k2"
 char igb_driver_name[] = "igb";
 char igb_driver_version[] = DRV_VERSION;
 static const char igb_driver_string[] =
@@ -60,13 +60,23 @@ static const struct e1000_info *igb_info_tbl[] = {
        [board_82575] = &e1000_82575_info,
 };
 
-static struct pci_device_id igb_pci_tbl[] = {
+static DEFINE_PCI_DEVICE_TABLE(igb_pci_tbl) = {
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_COPPER), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_FIBER), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_SERDES), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_SGMII), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_COPPER), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_FIBER), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_SERDES), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_SGMII), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_COPPER_DUAL), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_NS), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_NS_SERDES), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_FIBER), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_SERDES), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_SERDES_QUAD), board_82575 },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_QUAD_COPPER_ET2), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_QUAD_COPPER), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_COPPER), board_82575 },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_FIBER_SERDES), board_82575 },
@@ -128,6 +138,12 @@ static void igb_msg_task(struct igb_adapter *);
 static void igb_vmm_control(struct igb_adapter *);
 static int igb_set_vf_mac(struct igb_adapter *, int, unsigned char *);
 static void igb_restore_vf_multicasts(struct igb_adapter *adapter);
+static int igb_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac);
+static int igb_ndo_set_vf_vlan(struct net_device *netdev,
+                              int vf, u16 vlan, u8 qos);
+static int igb_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate);
+static int igb_ndo_get_vf_config(struct net_device *netdev, int vf,
+                                struct ifla_vf_info *ivi);
 
 #ifdef CONFIG_PM
 static int igb_suspend(struct pci_dev *, pm_message_t);
@@ -179,8 +195,6 @@ 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");
@@ -197,46 +211,30 @@ static cycle_t igb_read_clock(const struct cyclecounter *tc)
        u64 stamp = 0;
        int shift = 0;
 
+       /*
+        * The timestamp latches on lowest register read. For the 82580
+        * the lowest register is SYSTIMR instead of SYSTIML.  However we never
+        * adjusted TIMINCA so SYSTIMR will just read as all 0s so ignore it.
+        */
+       if (hw->mac.type == e1000_82580) {
+               stamp = rd32(E1000_SYSTIMR) >> 8;
+               shift = IGB_82580_TSYNC_SHIFT;
+       }
+
        stamp |= (u64)rd32(E1000_SYSTIML) << shift;
        stamp |= (u64)rd32(E1000_SYSTIMH) << (shift + 32);
        return stamp;
 }
 
-#ifdef DEBUG
 /**
- * igb_get_hw_dev_name - return device name string
+ * igb_get_hw_dev - return device
  * used by hardware layer to print debugging information
  **/
-char *igb_get_hw_dev_name(struct e1000_hw *hw)
+struct net_device *igb_get_hw_dev(struct e1000_hw *hw)
 {
        struct igb_adapter *adapter = hw->back;
-       return adapter->netdev->name;
-}
-
-/**
- * igb_get_time_str - format current NIC and system time as string
- */
-static char *igb_get_time_str(struct igb_adapter *adapter,
-                             char buffer[160])
-{
-       cycle_t hw = adapter->cycles.read(&adapter->cycles);
-       struct timespec nic = ns_to_timespec(timecounter_read(&adapter->clock));
-       struct timespec sys;
-       struct timespec delta;
-       getnstimeofday(&sys);
-
-       delta = timespec_sub(nic, sys);
-
-       sprintf(buffer,
-               "HW %llu, NIC %ld.%09lus, SYS %ld.%09lus, NIC-SYS %lds + %09luns",
-               hw,
-               (long)nic.tv_sec, nic.tv_nsec,
-               (long)sys.tv_sec, sys.tv_nsec,
-               (long)delta.tv_sec, delta.tv_nsec);
-
-       return buffer;
+       return adapter->netdev;
 }
-#endif
 
 /**
  * igb_init_module - Driver Registration Routine
@@ -252,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;
 }
@@ -290,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) {
@@ -300,31 +295,38 @@ 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:
+       case e1000_82580:
+       case e1000_i350:
        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;
        }
 }
 
 static void igb_free_queues(struct igb_adapter *adapter)
 {
-       kfree(adapter->tx_ring);
-       kfree(adapter->rx_ring);
-
-       adapter->tx_ring = NULL;
-       adapter->rx_ring = NULL;
+       int i;
 
+       for (i = 0; i < adapter->num_tx_queues; i++) {
+               kfree(adapter->tx_ring[i]);
+               adapter->tx_ring[i] = NULL;
+       }
+       for (i = 0; i < adapter->num_rx_queues; i++) {
+               kfree(adapter->rx_ring[i]);
+               adapter->rx_ring[i] = NULL;
+       }
        adapter->num_rx_queues = 0;
        adapter->num_tx_queues = 0;
 }
@@ -338,20 +340,13 @@ static void igb_free_queues(struct igb_adapter *adapter)
  **/
 static int igb_alloc_queues(struct igb_adapter *adapter)
 {
+       struct igb_ring *ring;
        int i;
 
-       adapter->tx_ring = kcalloc(adapter->num_tx_queues,
-                                  sizeof(struct igb_ring), GFP_KERNEL);
-       if (!adapter->tx_ring)
-               goto err;
-
-       adapter->rx_ring = kcalloc(adapter->num_rx_queues,
-                                  sizeof(struct igb_ring), GFP_KERNEL);
-       if (!adapter->rx_ring)
-               goto err;
-
        for (i = 0; i < adapter->num_tx_queues; i++) {
-               struct igb_ring *ring = &(adapter->tx_ring[i]);
+               ring = kzalloc(sizeof(struct igb_ring), GFP_KERNEL);
+               if (!ring)
+                       goto err;
                ring->count = adapter->tx_ring_count;
                ring->queue_index = i;
                ring->pdev = adapter->pdev;
@@ -359,10 +354,13 @@ static int igb_alloc_queues(struct igb_adapter *adapter)
                /* For 82575, context index must be unique per ring. */
                if (adapter->hw.mac.type == e1000_82575)
                        ring->flags = IGB_RING_FLAG_TX_CTX_IDX;
+               adapter->tx_ring[i] = ring;
        }
 
        for (i = 0; i < adapter->num_rx_queues; i++) {
-               struct igb_ring *ring = &(adapter->rx_ring[i]);
+               ring = kzalloc(sizeof(struct igb_ring), GFP_KERNEL);
+               if (!ring)
+                       goto err;
                ring->count = adapter->rx_ring_count;
                ring->queue_index = i;
                ring->pdev = adapter->pdev;
@@ -372,6 +370,7 @@ static int igb_alloc_queues(struct igb_adapter *adapter)
                /* set flag indicating ring supports SCTP checksum offload */
                if (adapter->hw.mac.type >= e1000_82576)
                        ring->flags |= IGB_RING_FLAG_RX_SCTP_CSUM;
+               adapter->rx_ring[i] = ring;
        }
 
        igb_cache_ring_register(adapter);
@@ -409,6 +408,8 @@ static void igb_assign_vector(struct igb_q_vector *q_vector, int msix_vector)
                        msixbm = E1000_EICR_RX_QUEUE0 << rx_queue;
                if (tx_queue > IGB_N0_QUEUE)
                        msixbm |= E1000_EICR_TX_QUEUE0 << tx_queue;
+               if (!adapter->msix_entries && msix_vector == 0)
+                       msixbm |= E1000_EIMS_OTHER;
                array_wr32(E1000_MSIXBM(0), msix_vector, msixbm);
                q_vector->eims_value = msixbm;
                break;
@@ -447,10 +448,50 @@ static void igb_assign_vector(struct igb_q_vector *q_vector, int msix_vector)
                }
                q_vector->eims_value = 1 << msix_vector;
                break;
+       case e1000_82580:
+       case e1000_i350:
+               /* 82580 uses the same table-based approach as 82576 but has fewer
+                  entries as a result we carry over for queues greater than 4. */
+               if (rx_queue > IGB_N0_QUEUE) {
+                       index = (rx_queue >> 1);
+                       ivar = array_rd32(E1000_IVAR0, index);
+                       if (rx_queue & 0x1) {
+                               /* vector goes into third byte of register */
+                               ivar = ivar & 0xFF00FFFF;
+                               ivar |= (msix_vector | E1000_IVAR_VALID) << 16;
+                       } else {
+                               /* vector goes into low byte of register */
+                               ivar = ivar & 0xFFFFFF00;
+                               ivar |= msix_vector | E1000_IVAR_VALID;
+                       }
+                       array_wr32(E1000_IVAR0, index, ivar);
+               }
+               if (tx_queue > IGB_N0_QUEUE) {
+                       index = (tx_queue >> 1);
+                       ivar = array_rd32(E1000_IVAR0, index);
+                       if (tx_queue & 0x1) {
+                               /* vector goes into high byte of register */
+                               ivar = ivar & 0x00FFFFFF;
+                               ivar |= (msix_vector | E1000_IVAR_VALID) << 24;
+                       } else {
+                               /* vector goes into second byte of register */
+                               ivar = ivar & 0xFFFF00FF;
+                               ivar |= (msix_vector | E1000_IVAR_VALID) << 8;
+                       }
+                       array_wr32(E1000_IVAR0, index, ivar);
+               }
+               q_vector->eims_value = 1 << msix_vector;
+               break;
        default:
                BUG();
                break;
        }
+
+       /* add q_vector eims value to global eims_enable_mask */
+       adapter->eims_enable_mask |= q_vector->eims_value;
+
+       /* configure q_vector to set itr on first interrupt */
+       q_vector->set_itr = 1;
 }
 
 /**
@@ -488,6 +529,8 @@ static void igb_configure_msix(struct igb_adapter *adapter)
                break;
 
        case e1000_82576:
+       case e1000_82580:
+       case e1000_i350:
                /* Turn on MSI-X capability first, or our settings
                 * won't stick.  And it will take days to debug. */
                wr32(E1000_GPIE, E1000_GPIE_MSIX_MODE |
@@ -507,11 +550,8 @@ static void igb_configure_msix(struct igb_adapter *adapter)
 
        adapter->eims_enable_mask |= adapter->eims_other;
 
-       for (i = 0; i < adapter->num_q_vectors; i++) {
-               struct igb_q_vector *q_vector = adapter->q_vector[i];
-               igb_assign_vector(q_vector, vector++);
-               adapter->eims_enable_mask |= q_vector->eims_value;
-       }
+       for (i = 0; i < adapter->num_q_vectors; i++)
+               igb_assign_vector(adapter->q_vector[i], vector++);
 
        wrfl();
 }
@@ -529,7 +569,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++;
@@ -552,7 +592,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;
@@ -591,6 +631,8 @@ static void igb_free_q_vectors(struct igb_adapter *adapter)
        for (v_idx = 0; v_idx < adapter->num_q_vectors; v_idx++) {
                struct igb_q_vector *q_vector = adapter->q_vector[v_idx];
                adapter->q_vector[v_idx] = NULL;
+               if (!q_vector)
+                       continue;
                netif_napi_del(&q_vector->napi);
                kfree(q_vector);
        }
@@ -622,14 +664,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 tx handler is separate add 1 for every tx queue */
+       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;
@@ -670,6 +713,7 @@ msi_only:
        }
 #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;
@@ -700,33 +744,24 @@ static int igb_alloc_q_vectors(struct igb_adapter *adapter)
                if (!q_vector)
                        goto err_out;
                q_vector->adapter = adapter;
-               q_vector->itr_shift = (hw->mac.type == e1000_82575) ? 16 : 0;
                q_vector->itr_register = hw->hw_addr + E1000_EITR(0);
                q_vector->itr_val = IGB_START_ITR;
-               q_vector->set_itr = 1;
                netif_napi_add(adapter->netdev, &q_vector->napi, igb_poll, 64);
                adapter->q_vector[v_idx] = q_vector;
        }
        return 0;
 
 err_out:
-       while (v_idx) {
-               v_idx--;
-               q_vector = adapter->q_vector[v_idx];
-               netif_napi_del(&q_vector->napi);
-               kfree(q_vector);
-               adapter->q_vector[v_idx] = NULL;
-       }
+       igb_free_q_vectors(adapter);
        return -ENOMEM;
 }
 
 static void igb_map_rx_ring_to_vector(struct igb_adapter *adapter,
                                       int ring_idx, int v_idx)
 {
-       struct igb_q_vector *q_vector;
+       struct igb_q_vector *q_vector = adapter->q_vector[v_idx];
 
-       q_vector = adapter->q_vector[v_idx];
-       q_vector->rx_ring = &adapter->rx_ring[ring_idx];
+       q_vector->rx_ring = adapter->rx_ring[ring_idx];
        q_vector->rx_ring->q_vector = q_vector;
        q_vector->itr_val = adapter->rx_itr_setting;
        if (q_vector->itr_val && q_vector->itr_val <= 3)
@@ -736,10 +771,9 @@ static void igb_map_rx_ring_to_vector(struct igb_adapter *adapter,
 static void igb_map_tx_ring_to_vector(struct igb_adapter *adapter,
                                       int ring_idx, int v_idx)
 {
-       struct igb_q_vector *q_vector;
+       struct igb_q_vector *q_vector = adapter->q_vector[v_idx];
 
-       q_vector = adapter->q_vector[v_idx];
-       q_vector->tx_ring = &adapter->tx_ring[ring_idx];
+       q_vector->tx_ring = adapter->tx_ring[ring_idx];
        q_vector->tx_ring->q_vector = q_vector;
        q_vector->itr_val = adapter->tx_itr_setting;
        if (q_vector->itr_val && q_vector->itr_val <= 3)
@@ -829,7 +863,6 @@ static int igb_request_irq(struct igb_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
        struct pci_dev *pdev = adapter->pdev;
-       struct e1000_hw *hw = &adapter->hw;
        int err = 0;
 
        if (adapter->msix_entries) {
@@ -861,23 +894,11 @@ static int igb_request_irq(struct igb_adapter *adapter)
                igb_setup_all_tx_resources(adapter);
                igb_setup_all_rx_resources(adapter);
        } else {
-               switch (hw->mac.type) {
-               case e1000_82575:
-                       wr32(E1000_MSIXBM(0),
-                            (E1000_EICR_RX_QUEUE0 |
-                             E1000_EICR_TX_QUEUE0 |
-                             E1000_EIMS_OTHER));
-                       break;
-               case e1000_82576:
-                       wr32(E1000_IVAR0, E1000_IVAR_VALID);
-                       break;
-               default:
-                       break;
-               }
+               igb_assign_vector(adapter->q_vector[0], 0);
        }
 
        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;
@@ -887,7 +908,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)
@@ -923,6 +944,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);
@@ -946,18 +972,25 @@ 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;
+               }
+               if (adapter->hw.mac.type == e1000_82580)
+                       ims |= E1000_IMS_DRSTA;
+
+               wr32(E1000_IMS, ims);
        } else {
-               wr32(E1000_IMS, IMS_ENABLE_MASK);
-               wr32(E1000_IAM, IMS_ENABLE_MASK);
+               wr32(E1000_IMS, IMS_ENABLE_MASK |
+                               E1000_IMS_DRSTA);
+               wr32(E1000_IAM, IMS_ENABLE_MASK |
+                               E1000_IMS_DRSTA);
        }
 }
 
@@ -1003,7 +1036,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
@@ -1051,7 +1083,7 @@ static void igb_configure(struct igb_adapter *adapter)
         * at least 1 descriptor unused to make sure
         * next_to_use != next_to_clean */
        for (i = 0; i < adapter->num_rx_queues; i++) {
-               struct igb_ring *ring = &adapter->rx_ring[i];
+               struct igb_ring *ring = adapter->rx_ring[i];
                igb_alloc_rx_buffers_adv(ring, igb_desc_unused(ring));
        }
 
@@ -1059,12 +1091,34 @@ static void igb_configure(struct igb_adapter *adapter)
        adapter->tx_queue_len = netdev->tx_queue_len;
 }
 
+/**
+ * igb_power_up_link - Power up the phy/serdes link
+ * @adapter: address of board private structure
+ **/
+void igb_power_up_link(struct igb_adapter *adapter)
+{
+       if (adapter->hw.phy.media_type == e1000_media_type_copper)
+               igb_power_up_phy_copper(&adapter->hw);
+       else
+               igb_power_up_serdes_link_82575(&adapter->hw);
+}
+
+/**
+ * igb_power_down_link - Power down the phy/serdes link
+ * @adapter: address of board private structure
+ */
+static void igb_power_down_link(struct igb_adapter *adapter)
+{
+       if (adapter->hw.phy.media_type == e1000_media_type_copper)
+               igb_power_down_phy_copper_82575(&adapter->hw);
+       else
+               igb_shutdown_serdes_link_82575(&adapter->hw);
+}
 
 /**
  * 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;
@@ -1081,6 +1135,8 @@ int igb_up(struct igb_adapter *adapter)
        }
        if (adapter->msix_entries)
                igb_configure_msix(adapter);
+       else
+               igb_assign_vector(adapter->q_vector[0], 0);
 
        /* Clear any pending interrupts. */
        rd32(E1000_ICR);
@@ -1095,15 +1151,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;
 
@@ -1168,6 +1226,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;
@@ -1178,6 +1237,11 @@ void igb_reset(struct igb_adapter *adapter)
         * To take effect CTRL.RST is required.
         */
        switch (mac->type) {
+       case e1000_i350:
+       case e1000_82580:
+               pba = rd32(E1000_RXPBS);
+               pba = igb_rxpbs_adjust_82580(pba);
+               break;
        case e1000_82576:
                pba = rd32(E1000_RXPBS);
                pba &= E1000_RXPBS_SIZE_MASK_82576;
@@ -1240,13 +1304,8 @@ void igb_reset(struct igb_adapter *adapter)
        hwm = min(((pba << 10) * 9 / 10),
                        ((pba << 10) - 2 * adapter->max_frame_size));
 
-       if (mac->type < e1000_82576) {
-               fc->high_water = hwm & 0xFFF8;  /* 8-byte granularity */
-               fc->low_water = fc->high_water - 8;
-       } else {
-               fc->high_water = hwm & 0xFFF0;  /* 16-byte granularity */
-               fc->low_water = fc->high_water - 16;
-       }
+       fc->high_water = hwm & 0xFFF0;  /* 16-byte granularity */
+       fc->low_water = fc->high_water - 16;
        fc->pause_time = 0xFFFF;
        fc->send_xon = 1;
        fc->current_mode = fc->requested_mode;
@@ -1266,23 +1325,30 @@ 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");
+
+       if (hw->mac.type == e1000_82580) {
+               u32 reg = rd32(E1000_PCIEMISC);
+               wr32(E1000_PCIEMISC,
+                               reg & ~E1000_PCIEMISC_LX_DECISION);
+       }
+       if (!netif_running(adapter->netdev))
+               igb_power_down_link(adapter);
 
        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_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,
@@ -1296,6 +1362,10 @@ static const struct net_device_ops igb_netdev_ops = {
        .ndo_vlan_rx_register   = igb_vlan_rx_register,
        .ndo_vlan_rx_add_vid    = igb_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = igb_vlan_rx_kill_vid,
+       .ndo_set_vf_mac         = igb_ndo_set_vf_mac,
+       .ndo_set_vf_vlan        = igb_ndo_set_vf_vlan,
+       .ndo_set_vf_tx_rate     = igb_ndo_set_vf_bw,
+       .ndo_get_vf_config      = igb_ndo_get_vf_config,
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller    = igb_netpoll,
 #endif
@@ -1318,10 +1388,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;
 
@@ -1398,8 +1469,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));
@@ -1417,7 +1486,6 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        igb_get_bus_info_pcie(hw);
 
        hw->phy.autoneg_wait_to_complete = false;
-       hw->mac.adaptive_ifs = true;
 
        /* Copper options */
        if (hw->phy.media_type == e1000_media_type_copper) {
@@ -1439,7 +1507,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;
@@ -1451,10 +1518,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 */
@@ -1504,6 +1571,10 @@ static int __devinit igb_probe(struct pci_dev *pdev,
 
        if (hw->bus.func == 0)
                hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
+       else if (hw->mac.type == e1000_82580)
+               hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A +
+                                NVM_82580_LAN_FUNC_OFFSET(hw->bus.func), 1,
+                                &eeprom_data);
        else if (hw->bus.func == 1)
                hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
 
@@ -1564,63 +1635,12 @@ static int __devinit igb_probe(struct pci_dev *pdev,
        }
 
 #endif
-
-       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;
-       }
-
        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" :
@@ -1653,8 +1673,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);
@@ -1699,9 +1719,6 @@ static void __devexit igb_remove(struct pci_dev *pdev)
 
        unregister_netdev(netdev);
 
-       if (!igb_check_reset_block(&adapter->hw))
-               igb_reset_phy(&adapter->hw);
-
        igb_clear_interrupt_scheme(adapter);
 
 #ifdef CONFIG_PCI_IOV
@@ -1718,11 +1735,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);
 
@@ -1779,6 +1797,113 @@ static void __devinit igb_probe_vfs(struct igb_adapter * adapter)
 #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_i350:
+       case e1000_82580:
+               memset(&adapter->cycles, 0, sizeof(adapter->cycles));
+               adapter->cycles.read = igb_read_clock;
+               adapter->cycles.mask = CLOCKSOURCE_MASK(64);
+               adapter->cycles.mult = 1;
+               /*
+                * The 82580 timesync updates the system timer every 8ns by 8ns
+                * and the value cannot be shifted.  Instead we need to shift
+                * the registers to generate a 64bit timer value.  As a result
+                * SYSTIMR/L/H, TXSTMPL/H, RXSTMPL/H all have to be shifted by
+                * 24 in order to generate a larger value for synchronization.
+                */
+               adapter->cycles.shift = IGB_82580_TSYNC_SHIFT;
+               /* disable system timer temporarily by setting bit 31 */
+               wr32(E1000_TSAUXC, 0x80000000);
+               wrfl();
+
+               /* Set registers so that rollover occurs soon to test this. */
+               wr32(E1000_SYSTIMR, 0x00000000);
+               wr32(E1000_SYSTIML, 0x80000000);
+               wr32(E1000_SYSTIMH, 0x000000FF);
+               wrfl();
+
+               /* enable system timer by clearing bit 31 */
+               wr32(E1000_TSAUXC, 0x0);
+               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_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
@@ -1808,12 +1933,24 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)
                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. */
@@ -1858,7 +1995,7 @@ static int igb_open(struct net_device *netdev)
        if (err)
                goto err_setup_rx;
 
-       /* e1000_power_up_phy(adapter); */
+       igb_power_up_link(adapter);
 
        /* before we allocate an interrupt, we must be ready to handle it.
         * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
@@ -1892,14 +2029,15 @@ 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;
 
 err_req_irq:
        igb_release_hw_control(adapter);
-       /* e1000_power_down_phy(adapter); */
+       igb_power_down_link(adapter);
        igb_free_all_rx_resources(adapter);
 err_setup_rx:
        igb_free_all_tx_resources(adapter);
@@ -1956,7 +2094,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)
@@ -1982,23 +2121,23 @@ 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]);
+               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]);
+                               igb_free_tx_resources(adapter->tx_ring[i]);
                        break;
                }
        }
 
-       for (i = 0; i < IGB_MAX_TX_QUEUES; i++) {
-               r_idx = i % adapter->num_tx_queues;
-               adapter->multi_tx_table[i] = &adapter->tx_ring[r_idx];
+       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;
 }
@@ -2081,7 +2220,7 @@ static void igb_configure_tx(struct igb_adapter *adapter)
        int i;
 
        for (i = 0; i < adapter->num_tx_queues; i++)
-               igb_configure_tx_ring(adapter, &adapter->tx_ring[i]);
+               igb_configure_tx_ring(adapter, adapter->tx_ring[i]);
 }
 
 /**
@@ -2120,6 +2259,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;
@@ -2134,15 +2274,16 @@ 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]);
+               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]);
+                               igb_free_rx_resources(adapter->rx_ring[i]);
                        break;
                }
        }
@@ -2178,11 +2319,16 @@ 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 */
                switch (hw->mac.type) {
+               case e1000_i350:
+               case e1000_82580:
+                       num_rx_queues = 1;
+                       shift = 0;
+                       break;
                case e1000_82576:
                        shift = 3;
                        num_rx_queues = 2;
@@ -2234,7 +2380,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;
@@ -2279,9 +2425,7 @@ 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 */
@@ -2347,7 +2491,8 @@ static void igb_rlpml_set(struct igb_adapter *adapter)
        wr32(E1000_RLPML, max_frame_size);
 }
 
-static inline void igb_set_vmolr(struct igb_adapter *adapter, int vfn)
+static inline void igb_set_vmolr(struct igb_adapter *adapter,
+                                int vfn, bool aupe)
 {
        struct e1000_hw *hw = &adapter->hw;
        u32 vmolr;
@@ -2360,13 +2505,16 @@ static inline void igb_set_vmolr(struct igb_adapter *adapter, int vfn)
                return;
 
        vmolr = rd32(E1000_VMOLR(vfn));
-       vmolr |= E1000_VMOLR_AUPE |        /* Accept untagged packets */
-                E1000_VMOLR_STRVLAN;      /* Strip vlan tags */
+       vmolr |= E1000_VMOLR_STRVLAN;      /* Strip vlan tags */
+       if (aupe)
+               vmolr |= E1000_VMOLR_AUPE;        /* Accept untagged packets */
+       else
+               vmolr &= ~(E1000_VMOLR_AUPE); /* Tagged packets ONLY */
 
        /* clear all bits that might not be set */
        vmolr &= ~(E1000_VMOLR_BAM | E1000_VMOLR_RSSE);
 
-       if (adapter->num_rx_queues > 1 && vfn == adapter->vfs_allocated_count)
+       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
@@ -2428,11 +2576,16 @@ void igb_configure_rx_ring(struct igb_adapter *adapter,
                         E1000_SRRCTL_BSIZEPKT_SHIFT;
                srrctl |= E1000_SRRCTL_DESCTYPE_ADV_ONEBUF;
        }
+       if (hw->mac.type == e1000_82580)
+               srrctl |= E1000_SRRCTL_TIMESTAMP;
+       /* Only set Drop Enable if we are supporting multiple queues */
+       if (adapter->vfs_allocated_count || adapter->num_rx_queues > 1)
+               srrctl |= E1000_SRRCTL_DROP_EN;
 
        wr32(E1000_SRRCTL(reg_idx), srrctl);
 
        /* set filtering for VMDQ pools */
-       igb_set_vmolr(adapter, reg_idx & 0x7);
+       igb_set_vmolr(adapter, reg_idx & 0x7, true);
 
        /* enable receive descriptor fetching */
        rxdctl = rd32(E1000_RXDCTL(reg_idx));
@@ -2464,7 +2617,7 @@ static void igb_configure_rx(struct igb_adapter *adapter)
        /* Setup the HW Rx Head and Tail Descriptor Pointers and
         * the Base and Length of the Rx Descriptor Ring */
        for (i = 0; i < adapter->num_rx_queues; i++)
-               igb_configure_rx_ring(adapter, &adapter->rx_ring[i]);
+               igb_configure_rx_ring(adapter, adapter->rx_ring[i]);
 }
 
 /**
@@ -2480,6 +2633,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);
 
@@ -2497,22 +2654,33 @@ static void igb_free_all_tx_resources(struct igb_adapter *adapter)
        int i;
 
        for (i = 0; i < adapter->num_tx_queues; i++)
-               igb_free_tx_resources(&adapter->tx_ring[i]);
+               igb_free_tx_resources(adapter->tx_ring[i]);
 }
 
 void igb_unmap_and_free_tx_resource(struct igb_ring *tx_ring,
                                    struct igb_buffer *buffer_info)
 {
-       buffer_info->dma = 0;
+       if (buffer_info->dma) {
+               if (buffer_info->mapped_as_page)
+                       pci_unmap_page(tx_ring->pdev,
+                                       buffer_info->dma,
+                                       buffer_info->length,
+                                       PCI_DMA_TODEVICE);
+               else
+                       pci_unmap_single(tx_ring->pdev,
+                                       buffer_info->dma,
+                                       buffer_info->length,
+                                       PCI_DMA_TODEVICE);
+               buffer_info->dma = 0;
+       }
        if (buffer_info->skb) {
-               skb_dma_unmap(&tx_ring->pdev->dev,
-                             buffer_info->skb,
-                             DMA_TO_DEVICE);
                dev_kfree_skb_any(buffer_info->skb);
                buffer_info->skb = NULL;
        }
        buffer_info->time_stamp = 0;
-       /* buffer_info must be completely set up in the transmit path */
+       buffer_info->length = 0;
+       buffer_info->next_to_watch = 0;
+       buffer_info->mapped_as_page = false;
 }
 
 /**
@@ -2538,14 +2706,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);
 }
 
 /**
@@ -2557,7 +2721,7 @@ static void igb_clean_all_tx_rings(struct igb_adapter *adapter)
        int i;
 
        for (i = 0; i < adapter->num_tx_queues; i++)
-               igb_clean_tx_ring(&adapter->tx_ring[i]);
+               igb_clean_tx_ring(adapter->tx_ring[i]);
 }
 
 /**
@@ -2573,6 +2737,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);
 
@@ -2590,7 +2758,7 @@ static void igb_free_all_rx_resources(struct igb_adapter *adapter)
        int i;
 
        for (i = 0; i < adapter->num_rx_queues; i++)
-               igb_free_rx_resources(&adapter->rx_ring[i]);
+               igb_free_rx_resources(adapter->rx_ring[i]);
 }
 
 /**
@@ -2605,6 +2773,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];
@@ -2642,9 +2811,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);
 }
 
 /**
@@ -2656,7 +2822,7 @@ static void igb_clean_all_rx_rings(struct igb_adapter *adapter)
        int i;
 
        for (i = 0; i < adapter->num_rx_queues; i++)
-               igb_clean_rx_ring(&adapter->rx_ring[i]);
+               igb_clean_rx_ring(adapter->rx_ring[i]);
 }
 
 /**
@@ -2698,38 +2864,30 @@ static int igb_write_mc_addr_list(struct net_device *netdev)
 {
        struct igb_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
-       struct dev_mc_list *mc_ptr = netdev->mc_list;
+       struct netdev_hw_addr *ha;
        u8  *mta_list;
-       u32 vmolr = 0;
        int i;
 
-       if (!netdev->mc_count) {
+       if (netdev_mc_empty(netdev)) {
                /* nothing to program, so clear mc list */
                igb_update_mc_addr_list(hw, NULL, 0);
                igb_restore_vf_multicasts(adapter);
                return 0;
        }
 
-       mta_list = kzalloc(netdev->mc_count * 6, GFP_ATOMIC);
+       mta_list = kzalloc(netdev_mc_count(netdev) * 6, GFP_ATOMIC);
        if (!mta_list)
                return -ENOMEM;
 
-       /* set vmolr receive overflow multicast bit */
-       vmolr |= E1000_VMOLR_ROMPE;
-
        /* The shared function expects a packed array of only addresses. */
-       mc_ptr = netdev->mc_list;
+       i = 0;
+       netdev_for_each_mc_addr(ha, netdev)
+               memcpy(mta_list + (i++ * ETH_ALEN), ha->addr, ETH_ALEN);
 
-       for (i = 0; i < netdev->mc_count; i++) {
-               if (!mc_ptr)
-                       break;
-               memcpy(mta_list + (i*ETH_ALEN), mc_ptr->dmi_addr, ETH_ALEN);
-               mc_ptr = mc_ptr->next;
-       }
        igb_update_mc_addr_list(hw, mta_list, i);
        kfree(mta_list);
 
-       return netdev->mc_count;
+       return netdev_mc_count(netdev);
 }
 
 /**
@@ -2750,12 +2908,13 @@ static int igb_write_uc_addr_list(struct net_device *netdev)
        int count = 0;
 
        /* return ENOMEM indicating insufficient memory for addresses */
-       if (netdev->uc.count > rar_entries)
+       if (netdev_uc_count(netdev) > rar_entries)
                return -ENOMEM;
 
-       if (netdev->uc.count && rar_entries) {
+       if (!netdev_uc_empty(netdev) && rar_entries) {
                struct netdev_hw_addr *ha;
-               list_for_each_entry(ha, &netdev->uc.list, list) {
+
+               netdev_for_each_uc_addr(ha, netdev) {
                        if (!rar_entries)
                                break;
                        igb_rar_set_qsel(adapter, ha->addr,
@@ -2859,7 +3018,7 @@ static void igb_update_phy_info(unsigned long data)
  * igb_has_link - check shared code for link and determine up/down
  * @adapter: pointer to driver private info
  **/
-static bool igb_has_link(struct igb_adapter *adapter)
+bool igb_has_link(struct igb_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
        bool link_active = false;
@@ -2905,36 +3064,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 */
@@ -2978,32 +3134,25 @@ static void igb_watchdog_task(struct work_struct *work)
                }
        }
 
-link_up:
        igb_update_stats(adapter);
 
-       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 */
@@ -3018,9 +3167,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,
@@ -3092,6 +3238,10 @@ static void igb_update_ring_itr(struct igb_q_vector *q_vector)
        else
                new_val = avg_wire_size / 2;
 
+       /* when in itr mode 3 do not exceed 20K ints/sec */
+       if (adapter->rx_itr_setting == 3 && new_val < 196)
+               new_val = 196;
+
 set_itr_val:
        if (new_val != q_vector->itr_val) {
                q_vector->itr_val = new_val;
@@ -3187,13 +3337,13 @@ static void igb_set_itr(struct igb_adapter *adapter)
 
        adapter->rx_itr = igb_update_itr(adapter,
                                    adapter->rx_itr,
-                                   adapter->rx_ring->total_packets,
-                                   adapter->rx_ring->total_bytes);
+                                   q_vector->rx_ring->total_packets,
+                                   q_vector->rx_ring->total_bytes);
 
        adapter->tx_itr = igb_update_itr(adapter,
                                    adapter->tx_itr,
-                                   adapter->tx_ring->total_packets,
-                                   adapter->tx_ring->total_bytes);
+                                   q_vector->tx_ring->total_packets,
+                                   q_vector->tx_ring->total_bytes);
        current_itr = max(adapter->rx_itr, adapter->tx_itr);
 
        /* conservative mode (itr 3) eliminates the lowest_latency setting */
@@ -3216,10 +3366,10 @@ static void igb_set_itr(struct igb_adapter *adapter)
        }
 
 set_itr_now:
-       adapter->rx_ring->total_bytes = 0;
-       adapter->rx_ring->total_packets = 0;
-       adapter->tx_ring->total_bytes = 0;
-       adapter->tx_ring->total_packets = 0;
+       q_vector->rx_ring->total_bytes = 0;
+       q_vector->rx_ring->total_packets = 0;
+       q_vector->tx_ring->total_bytes = 0;
+       q_vector->tx_ring->total_packets = 0;
 
        if (new_itr != q_vector->itr_val) {
                /* this attempts to bias the interrupt rate towards Bulk
@@ -3247,9 +3397,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)
@@ -3259,8 +3409,8 @@ static inline int igb_tso_adv(struct igb_ring *tx_ring,
        int err;
        struct igb_buffer *buffer_info;
        u32 info = 0, tu_cmd = 0;
-       u32 mss_l4len_idx, l4len;
-       *hdr_len = 0;
+       u32 mss_l4len_idx;
+       u8 l4len;
 
        if (skb_header_cloned(skb)) {
                err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
@@ -3279,7 +3429,7 @@ static inline int igb_tso_adv(struct igb_ring *tx_ring,
                                                         iph->daddr, 0,
                                                         IPPROTO_TCP,
                                                         0);
-       } else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) {
+       } else if (skb_is_gso_v6(skb)) {
                ipv6_hdr(skb)->payload_len = 0;
                tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
                                                       &ipv6_hdr(skb)->daddr,
@@ -3348,6 +3498,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);
@@ -3423,28 +3574,24 @@ static inline int igb_tx_map_adv(struct igb_ring *tx_ring, struct sk_buff *skb,
        unsigned int len = skb_headlen(skb);
        unsigned int count = 0, i;
        unsigned int f;
-       dma_addr_t *map;
 
        i = tx_ring->next_to_use;
 
-       if (skb_dma_map(&pdev->dev, skb, DMA_TO_DEVICE)) {
-               dev_err(&pdev->dev, "TX DMA map failed\n");
-               return 0;
-       }
-
-       map = skb_shinfo(skb)->dma_maps;
-
        buffer_info = &tx_ring->buffer_info[i];
        BUG_ON(len >= IGB_MAX_DATA_PER_TXD);
        buffer_info->length = len;
        /* set time_stamp *before* dma to help avoid a possible race */
        buffer_info->time_stamp = jiffies;
        buffer_info->next_to_watch = i;
-       buffer_info->dma = skb_shinfo(skb)->dma_head;
+       buffer_info->dma = pci_map_single(pdev, skb->data, len,
+                                         PCI_DMA_TODEVICE);
+       if (pci_dma_mapping_error(pdev, buffer_info->dma))
+               goto dma_error;
 
        for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) {
                struct skb_frag_struct *frag;
 
+               count++;
                i++;
                if (i == tx_ring->count)
                        i = 0;
@@ -3457,24 +3604,53 @@ static inline int igb_tx_map_adv(struct igb_ring *tx_ring, struct sk_buff *skb,
                buffer_info->length = len;
                buffer_info->time_stamp = jiffies;
                buffer_info->next_to_watch = i;
-               buffer_info->dma = map[count];
-               count++;
+               buffer_info->mapped_as_page = true;
+               buffer_info->dma = pci_map_page(pdev,
+                                               frag->page,
+                                               frag->page_offset,
+                                               len,
+                                               PCI_DMA_TODEVICE);
+               if (pci_dma_mapping_error(pdev, buffer_info->dma))
+                       goto dma_error;
+
        }
 
        tx_ring->buffer_info[i].skb = skb;
+       tx_ring->buffer_info[i].gso_segs = skb_shinfo(skb)->gso_segs ?: 1;
        tx_ring->buffer_info[first].next_to_watch = i;
 
-       return count + 1;
+       return ++count;
+
+dma_error:
+       dev_err(&pdev->dev, "TX DMA map failed\n");
+
+       /* clear timestamp and dma mappings for failed buffer_info mapping */
+       buffer_info->dma = 0;
+       buffer_info->time_stamp = 0;
+       buffer_info->length = 0;
+       buffer_info->next_to_watch = 0;
+       buffer_info->mapped_as_page = false;
+
+       /* clear timestamp and dma mappings for remaining portion of packet */
+       while (count--) {
+               if (i == 0)
+                       i = tx_ring->count;
+               i--;
+               buffer_info = &tx_ring->buffer_info[i];
+               igb_unmap_and_free_tx_resource(tx_ring, buffer_info);
+       }
+
+       return 0;
 }
 
 static inline void igb_tx_queue_adv(struct igb_ring *tx_ring,
-                                   int tx_flags, int count, u32 paylen,
+                                   u32 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);
@@ -3507,18 +3683,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
@@ -3556,7 +3732,7 @@ static int __igb_maybe_stop_tx(struct igb_ring *tx_ring, int size)
        return 0;
 }
 
-static int igb_maybe_stop_tx(struct igb_ring *tx_ring, int size)
+static inline int igb_maybe_stop_tx(struct igb_ring *tx_ring, int size)
 {
        if (igb_desc_unused(tx_ring) >= size)
                return 0;
@@ -3567,11 +3743,10 @@ 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;
+       int tso = 0, count;
+       u32 tx_flags = 0;
+       u16 first;
        u8 hdr_len = 0;
-       int count = 0;
-       int tso = 0;
        union skb_shared_tx *shtx = skb_tx(skb);
 
        /* need: 1 descriptor per page,
@@ -3589,7 +3764,7 @@ netdev_tx_t igb_xmit_frame_ring_adv(struct sk_buff *skb,
                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);
        }
@@ -3600,6 +3775,7 @@ 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;
@@ -3613,11 +3789,10 @@ 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) {
                dev_kfree_skb_any(skb);
                tx_ring->buffer_info[first].time_stamp = 0;
@@ -3671,6 +3846,10 @@ static void igb_tx_timeout(struct net_device *netdev)
 
        /* Do the reset outside of interrupt context */
        adapter->tx_timeout_count++;
+
+       if (hw->mac.type == e1000_82580)
+               hw->dev_spec._82575.global_device_reset = true;
+
        schedule_work(&adapter->reset_task);
        wr32(E1000_EICS,
             (adapter->eims_enable_mask & ~adapter->eims_other));
@@ -3707,17 +3886,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;
        }
 
@@ -3726,12 +3905,16 @@ 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.
         * i.e. RXBUFFER_2048 --> size-4096 slab
         */
 
+       if (adapter->hw.mac.type == e1000_82580)
+               max_frame += IGB_TS_HDR_LEN;
+
        if (max_frame <= IGB_RXBUFFER_1024)
                rx_buffer_len = IGB_RXBUFFER_1024;
        else if (max_frame <= MAXIMUM_ETHERNET_VLAN_SIZE)
@@ -3739,15 +3922,23 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu)
        else
                rx_buffer_len = IGB_RXBUFFER_128;
 
+       if ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN + IGB_TS_HDR_LEN) ||
+            (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE + IGB_TS_HDR_LEN))
+               rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE + IGB_TS_HDR_LEN;
+
+       if ((adapter->hw.mac.type == e1000_82580) &&
+           (rx_buffer_len == IGB_RXBUFFER_128))
+               rx_buffer_len += IGB_RXBUFFER_64;
+
        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;
 
        for (i = 0; i < adapter->num_rx_queues; i++)
-               adapter->rx_ring[i].rx_buffer_len = rx_buffer_len;
+               adapter->rx_ring[i]->rx_buffer_len = rx_buffer_len;
 
        if (netif_running(netdev))
                igb_up(adapter);
@@ -3766,10 +3957,10 @@ 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;
+       u32 rnbc, reg;
        u16 phy_tmp;
        int i;
        u64 bytes, packets;
@@ -3789,23 +3980,25 @@ void igb_update_stats(struct igb_adapter *adapter)
        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;
-               netdev->stats.rx_fifo_errors += rqdpc_tmp;
-               bytes += adapter->rx_ring[i].rx_stats.bytes;
-               packets += adapter->rx_ring[i].rx_stats.packets;
+               struct igb_ring *ring = adapter->rx_ring[i];
+               ring->rx_stats.drops += rqdpc_tmp;
+               net_stats->rx_fifo_errors += rqdpc_tmp;
+               bytes += ring->rx_stats.bytes;
+               packets += ring->rx_stats.packets;
        }
 
-       netdev->stats.rx_bytes = bytes;
-       netdev->stats.rx_packets = 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;
+               struct igb_ring *ring = adapter->tx_ring[i];
+               bytes += ring->tx_stats.bytes;
+               packets += ring->tx_stats.packets;
        }
-       netdev->stats.tx_bytes = bytes;
-       netdev->stats.tx_packets = packets;
+       net_stats->tx_bytes = bytes;
+       net_stats->tx_packets = packets;
 
        /* read stats registers */
        adapter->stats.crcerrs += rd32(E1000_CRCERRS);
@@ -3842,7 +4035,7 @@ void igb_update_stats(struct igb_adapter *adapter)
        rd32(E1000_GOTCH); /* clear GOTCL */
        rnbc = rd32(E1000_RNBC);
        adapter->stats.rnbc += rnbc;
-       netdev->stats.rx_fifo_errors += 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);
@@ -3860,16 +4053,17 @@ void igb_update_stats(struct igb_adapter *adapter)
        adapter->stats.mptc += rd32(E1000_MPTC);
        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);
-       adapter->stats.colc += hw->mac.collision_delta;
+       adapter->stats.tpt += rd32(E1000_TPT);
+       adapter->stats.colc += rd32(E1000_COLC);
 
        adapter->stats.algnerrc += rd32(E1000_ALGNERRC);
-       adapter->stats.rxerrc += rd32(E1000_RXERRC);
-       adapter->stats.tncrs += rd32(E1000_TNCRS);
+       /* read internal phy specific stats */
+       reg = rd32(E1000_CTRL_EXT);
+       if (!(reg & E1000_CTRL_EXT_LINK_MODE_MASK)) {
+               adapter->stats.rxerrc += rd32(E1000_RXERRC);
+               adapter->stats.tncrs += rd32(E1000_TNCRS);
+       }
+
        adapter->stats.tsctc += rd32(E1000_TSCTC);
        adapter->stats.tsctfc += rd32(E1000_TSCTFC);
 
@@ -3884,29 +4078,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 */
 
        /* 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 */
 
@@ -3932,6 +4126,9 @@ static irqreturn_t igb_msix_other(int irq, void *data)
        u32 icr = rd32(E1000_ICR);
        /* reading ICR causes bit 31 of EICR to be cleared */
 
+       if (icr & E1000_ICR_DRSTA)
+               schedule_work(&adapter->reset_task);
+
        if (icr & E1000_ICR_DOUTSYNC) {
                /* HW is reporting DMA is out of sync */
                adapter->stats.doosync++;
@@ -3948,7 +4145,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;
@@ -3956,6 +4158,7 @@ static irqreturn_t igb_msix_other(int irq, void *data)
 
 static void igb_write_itr(struct igb_q_vector *q_vector)
 {
+       struct igb_adapter *adapter = q_vector->adapter;
        u32 itr_val = q_vector->itr_val & 0x7FFC;
 
        if (!q_vector->set_itr)
@@ -3964,8 +4167,8 @@ static void igb_write_itr(struct igb_q_vector *q_vector)
        if (!itr_val)
                itr_val = 0x4;
 
-       if (q_vector->itr_shift)
-               itr_val |= itr_val << q_vector->itr_shift;
+       if (adapter->hw.mac.type == e1000_82575)
+               itr_val |= itr_val << 16;
        else
                itr_val |= 0x8000000;
 
@@ -4042,9 +4245,8 @@ static void igb_setup_dca(struct igb_adapter *adapter)
        wr32(E1000_DCA_CTRL, E1000_DCA_CTRL_DCA_MODE_CB2);
 
        for (i = 0; i < adapter->num_q_vectors; i++) {
-               struct igb_q_vector *q_vector = adapter->q_vector[i];
-               q_vector->cpu = -1;
-               igb_update_dca(q_vector);
+               adapter->q_vector[i]->cpu = -1;
+               igb_update_dca(adapter->q_vector[i]);
        }
 }
 
@@ -4052,6 +4254,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;
 
@@ -4060,12 +4263,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;
                }
@@ -4075,7 +4275,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);
                }
@@ -4320,10 +4520,57 @@ static s32 igb_vlvf_set(struct igb_adapter *adapter, u32 vid, bool add, u32 vf)
                                reg |= size;
                                wr32(E1000_VMOLR(vf), reg);
                        }
-                       return 0;
                }
        }
-       return -1;
+       return 0;
+}
+
+static void igb_set_vmvir(struct igb_adapter *adapter, u32 vid, u32 vf)
+{
+       struct e1000_hw *hw = &adapter->hw;
+
+       if (vid)
+               wr32(E1000_VMVIR(vf), (vid | E1000_VMVIR_VLANA_DEFAULT));
+       else
+               wr32(E1000_VMVIR(vf), 0);
+}
+
+static int igb_ndo_set_vf_vlan(struct net_device *netdev,
+                              int vf, u16 vlan, u8 qos)
+{
+       int err = 0;
+       struct igb_adapter *adapter = netdev_priv(netdev);
+
+       if ((vf >= adapter->vfs_allocated_count) || (vlan > 4095) || (qos > 7))
+               return -EINVAL;
+       if (vlan || qos) {
+               err = igb_vlvf_set(adapter, vlan, !!vlan, vf);
+               if (err)
+                       goto out;
+               igb_set_vmvir(adapter, vlan | (qos << VLAN_PRIO_SHIFT), vf);
+               igb_set_vmolr(adapter, vf, !vlan);
+               adapter->vf_data[vf].pf_vlan = vlan;
+               adapter->vf_data[vf].pf_qos = qos;
+               dev_info(&adapter->pdev->dev,
+                        "Setting VLAN %d, QOS 0x%x on VF %d\n", vlan, qos, vf);
+               if (test_bit(__IGB_DOWN, &adapter->state)) {
+                       dev_warn(&adapter->pdev->dev,
+                                "The VF VLAN has been set,"
+                                " but the PF device is not up.\n");
+                       dev_warn(&adapter->pdev->dev,
+                                "Bring the PF device up before"
+                                " attempting to use the VF device.\n");
+               }
+       } else {
+               igb_vlvf_set(adapter, adapter->vf_data[vf].pf_vlan,
+                                  false, vf);
+               igb_set_vmvir(adapter, vlan, vf);
+               igb_set_vmolr(adapter, vf, true);
+               adapter->vf_data[vf].pf_vlan = 0;
+               adapter->vf_data[vf].pf_qos = 0;
+       }
+out:
+       return err;
 }
 
 static int igb_set_vf_vlan(struct igb_adapter *adapter, u32 *msgbuf, u32 vf)
@@ -4336,15 +4583,21 @@ static int igb_set_vf_vlan(struct igb_adapter *adapter, u32 *msgbuf, u32 vf)
 
 static inline void igb_vf_reset(struct igb_adapter *adapter, u32 vf)
 {
-       /* clear all flags */
-       adapter->vf_data[vf].flags = 0;
+       /* clear flags */
+       adapter->vf_data[vf].flags &= ~(IGB_VF_FLAG_PF_SET_MAC);
        adapter->vf_data[vf].last_nack = jiffies;
 
        /* reset offloads to defaults */
-       igb_set_vmolr(adapter, vf);
+       igb_set_vmolr(adapter, vf, true);
 
        /* reset vlans for device */
        igb_clear_vf_vfta(adapter, vf);
+       if (adapter->vf_data[vf].pf_vlan)
+               igb_ndo_set_vf_vlan(adapter->netdev, vf,
+                                   adapter->vf_data[vf].pf_vlan,
+                                   adapter->vf_data[vf].pf_qos);
+       else
+               igb_clear_vf_vfta(adapter, vf);
 
        /* reset multicast table array for vf */
        adapter->vf_data[vf].num_vf_mc_hashes = 0;
@@ -4358,7 +4611,8 @@ 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);
+       if (!(adapter->vf_data[vf].flags & IGB_VF_FLAG_PF_SET_MAC))
+               random_ether_addr(vf_mac);
 
        /* process remaining reset events */
        igb_vf_reset(adapter, vf);
@@ -4427,8 +4681,14 @@ static void igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
 
        retval = igb_read_mbx(hw, msgbuf, E1000_VFMAILBOX_SIZE, vf);
 
-       if (retval)
+       if (retval) {
+               /* if receive failed revoke VF CTS stats and restart init */
                dev_err(&pdev->dev, "Error receiving message from VF\n");
+               vf_data->flags &= ~IGB_VF_FLAG_CTS;
+               if (!time_after(jiffies, vf_data->last_nack + (2 * HZ)))
+                       return;
+               goto out;
+       }
 
        /* this is a message we already processed, do nothing */
        if (msgbuf[0] & (E1000_VT_MSGTYPE_ACK | E1000_VT_MSGTYPE_NACK))
@@ -4445,12 +4705,10 @@ static void igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
        }
 
        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;
+               if (!time_after(jiffies, vf_data->last_nack + (2 * HZ)))
+                       return;
+               retval = -1;
+               goto out;
        }
 
        switch ((msgbuf[0] & 0xFFFF)) {
@@ -4467,22 +4725,25 @@ static void igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
                retval = igb_set_vf_rlpml(adapter, msgbuf[1], vf);
                break;
        case E1000_VF_SET_VLAN:
-               retval = igb_set_vf_vlan(adapter, msgbuf, vf);
+               if (adapter->vf_data[vf].pf_vlan)
+                       retval = -1;
+               else
+                       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;
        }
 
+       msgbuf[0] |= E1000_VT_MSGTYPE_CTS;
+out:
        /* notify the VF of the results of what it sent us */
        if (retval)
                msgbuf[0] |= E1000_VT_MSGTYPE_NACK;
        else
                msgbuf[0] |= E1000_VT_MSGTYPE_ACK;
 
-       msgbuf[0] |= E1000_VT_MSGTYPE_CTS;
-
        igb_write_mbx(hw, msgbuf, 1, vf);
 }
 
@@ -4548,6 +4809,9 @@ static irqreturn_t igb_intr_msi(int irq, void *data)
 
        igb_write_itr(q_vector);
 
+       if (icr & E1000_ICR_DRSTA)
+               schedule_work(&adapter->reset_task);
+
        if (icr & E1000_ICR_DOUTSYNC) {
                /* HW is reporting DMA is out of sync */
                adapter->stats.doosync++;
@@ -4587,6 +4851,9 @@ static irqreturn_t igb_intr(int irq, void *data)
        if (!(icr & E1000_ICR_INT_ASSERTED))
                return IRQ_NONE;
 
+       if (icr & E1000_ICR_DRSTA)
+               schedule_work(&adapter->reset_task);
+
        if (icr & E1000_ICR_DOUTSYNC) {
                /* HW is reporting DMA is out of sync */
                adapter->stats.doosync++;
@@ -4674,6 +4941,13 @@ static void igb_systim_to_hwtstamp(struct igb_adapter *adapter,
 {
        u64 ns;
 
+       /*
+        * The 82580 starts with 1ns at bit 0 in RX/TXSTMPL, shift this up to
+        * 24 to match clock shift we setup earlier.
+        */
+       if (adapter->hw.mac.type == e1000_82580)
+               regval <<= IGB_82580_TSYNC_SHIFT;
+
        ns = timecounter_cyc2time(&adapter->clock, regval);
        timecompare_update(&adapter->compare, ns);
        memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
@@ -4743,7 +5017,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
                        if (skb) {
                                unsigned int segs, bytecount;
                                /* gso_segs is currently only valid for tcp */
-                               segs = skb_shinfo(skb)->gso_segs ?: 1;
+                               segs = buffer_info->gso_segs;
                                /* multiply data chunks by size of headers */
                                bytecount = ((segs - 1) * skb_headlen(skb)) +
                                            skb->len;
@@ -4786,9 +5060,8 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
                tx_ring->detect_tx_hung = false;
                if (tx_ring->buffer_info[i].time_stamp &&
                    time_after(jiffies, tx_ring->buffer_info[i].time_stamp +
-                              (adapter->tx_timeout_factor * HZ))
-                   && !(rd32(E1000_STATUS) &
-                        E1000_STATUS_TXOFF)) {
+                              (adapter->tx_timeout_factor * HZ)) &&
+                   !(rd32(E1000_STATUS) & E1000_STATUS_TXOFF)) {
 
                        /* detected Tx unit hang */
                        dev_err(&tx_ring->pdev->dev,
@@ -4808,7 +5081,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);
@@ -4873,7 +5146,7 @@ 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,
+static void igb_rx_hwtstamp(struct igb_q_vector *q_vector, u32 staterr,
                                    struct sk_buff *skb)
 {
        struct igb_adapter *adapter = q_vector->adapter;
@@ -4891,13 +5164,18 @@ static inline void igb_rx_hwtstamp(struct igb_q_vector *q_vector, u32 staterr,
         * 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;
+       if (staterr & E1000_RXDADV_STAT_TSIP) {
+               u32 *stamp = (u32 *)skb->data;
+               regval = le32_to_cpu(*(stamp + 2));
+               regval |= (u64)le32_to_cpu(*(stamp + 3)) << 32;
+               skb_pull(skb, IGB_TS_HDR_LEN);
+       } else {
+               if(!(rd32(E1000_TSYNCRXCTL) & E1000_TSYNCRXCTL_VALID))
+                       return;
 
-       regval = rd32(E1000_RXSTMPL);
-       regval |= (u64)rd32(E1000_RXSTMPH) << 32;
+               regval = rd32(E1000_RXSTMPL);
+               regval |= (u64)rd32(E1000_RXSTMPH) << 32;
+       }
 
        igb_systim_to_hwtstamp(adapter, skb_hwtstamps(skb), regval);
 }
@@ -4926,6 +5204,7 @@ static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,
        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;
@@ -4949,6 +5228,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];
@@ -4979,14 +5259,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;
                }
 
@@ -5003,7 +5283,8 @@ send_up:
                        goto next_desc;
                }
 
-               igb_rx_hwtstamp(q_vector, staterr, skb);
+               if (staterr & (E1000_RXDADV_STAT_TSIP | E1000_RXDADV_STAT_TS))
+                       igb_rx_hwtstamp(q_vector, staterr, skb);
                total_bytes += skb->len;
                total_packets++;
 
@@ -5068,7 +5349,7 @@ void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, int cleaned_count)
 
                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;
@@ -5082,9 +5363,16 @@ void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, int cleaned_count)
                                             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++;
@@ -5092,10 +5380,18 @@ void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, int cleaned_count)
                        }
 
                        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. */
@@ -5104,8 +5400,7 @@ void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, int cleaned_count)
                             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;
                }
 
@@ -5269,6 +5564,16 @@ static int igb_hwtstamp_ioctl(struct net_device *netdev,
                return 0;
        }
 
+       /*
+        * Per-packet timestamping only works if all packets are
+        * timestamped, so enable timestamping in all packets as
+        * long as one rx filter was configured.
+        */
+       if ((hw->mac.type == e1000_82580) && tsync_rx_ctl) {
+               tsync_rx_ctl = E1000_TSYNCRXCTL_ENABLED;
+               tsync_rx_ctl |= E1000_TSYNCRXCTL_TYPE_ALL;
+       }
+
        /* enable/disable TX */
        regval = rd32(E1000_TSYNCTXCTL);
        regval &= ~E1000_TSYNCTXCTL_ENABLED;
@@ -5457,6 +5762,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;
@@ -5480,8 +5786,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;
@@ -5535,7 +5840,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);
@@ -5546,7 +5851,9 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake)
 
        *enable_wake = wufc || adapter->en_mng_pt;
        if (!*enable_wake)
-               igb_shutdown_serdes_link_82575(hw);
+               igb_power_down_link(adapter);
+       else
+               igb_power_up_link(adapter);
 
        /* Release control of h/w to f/w.  If f/w is AMT enabled, this
         * would have already happened in close and is redundant. */
@@ -5586,6 +5893,7 @@ static int igb_resume(struct pci_dev *pdev)
 
        pci_set_power_state(pdev, PCI_D0);
        pci_restore_state(pdev);
+       pci_save_state(pdev);
 
        err = pci_enable_device_mem(pdev);
        if (err) {
@@ -5603,8 +5911,6 @@ static int igb_resume(struct pci_dev *pdev)
                return -ENOMEM;
        }
 
-       /* e1000_power_up_phy(adapter); */
-
        igb_reset(adapter);
 
        /* let the f/w know that the h/w is now under the control of the
@@ -5713,6 +6019,7 @@ static pci_ers_result_t igb_io_slot_reset(struct pci_dev *pdev)
        } else {
                pci_set_master(pdev);
                pci_restore_state(pdev);
+               pci_save_state(pdev);
 
                pci_enable_wake(pdev, PCI_D3hot, 0);
                pci_enable_wake(pdev, PCI_D3cold, 0);
@@ -5801,24 +6108,67 @@ static int igb_set_vf_mac(struct igb_adapter *adapter,
        return 0;
 }
 
+static int igb_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
+{
+       struct igb_adapter *adapter = netdev_priv(netdev);
+       if (!is_valid_ether_addr(mac) || (vf >= adapter->vfs_allocated_count))
+               return -EINVAL;
+       adapter->vf_data[vf].flags |= IGB_VF_FLAG_PF_SET_MAC;
+       dev_info(&adapter->pdev->dev, "setting MAC %pM on VF %d\n", mac, vf);
+       dev_info(&adapter->pdev->dev, "Reload the VF driver to make this"
+                                     " change effective.");
+       if (test_bit(__IGB_DOWN, &adapter->state)) {
+               dev_warn(&adapter->pdev->dev, "The VF MAC address has been set,"
+                        " but the PF device is not up.\n");
+               dev_warn(&adapter->pdev->dev, "Bring the PF device up before"
+                        " attempting to use the VF device.\n");
+       }
+       return igb_set_vf_mac(adapter, vf, mac);
+}
+
+static int igb_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate)
+{
+       return -EOPNOTSUPP;
+}
+
+static int igb_ndo_get_vf_config(struct net_device *netdev,
+                                int vf, struct ifla_vf_info *ivi)
+{
+       struct igb_adapter *adapter = netdev_priv(netdev);
+       if (vf >= adapter->vfs_allocated_count)
+               return -EINVAL;
+       ivi->vf = vf;
+       memcpy(&ivi->mac, adapter->vf_data[vf].vf_mac_addresses, ETH_ALEN);
+       ivi->tx_rate = 0;
+       ivi->vlan = adapter->vf_data[vf].pf_vlan;
+       ivi->qos = adapter->vf_data[vf].pf_qos;
+       return 0;
+}
+
 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)
+       switch (hw->mac.type) {
+       case e1000_82575:
+       default:
+               /* replication is not supported for 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);
+       case e1000_82576:
+               /* notify HW that the MAC is adding vlan tags */
+               reg = rd32(E1000_DTXCTL);
+               reg |= E1000_DTXCTL_VLAN_ADDED;
+               wr32(E1000_DTXCTL, reg);
+       case e1000_82580:
+               /* enable replication vlan tag stripping */
+               reg = rd32(E1000_RPLOLR);
+               reg |= E1000_RPLOLR_STRVLAN;
+               wr32(E1000_RPLOLR, reg);
+       case e1000_i350:
+               /* none of the above registers are supported by i350 */
+               break;
+       }
 
        if (adapter->vfs_allocated_count) {
                igb_vmdq_set_loopback_pf(hw, true);