]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/ixgbe/ixgbe_main.c
ixgbe: update version number for ixgbe
[net-next-2.6.git] / drivers / net / ixgbe / ixgbe_main.c
index 0d6422c597234f423092bb8aa95fa02c99bd332e..02541956744063359ffaa0120d24484b2e91de3c 100644 (file)
@@ -52,13 +52,14 @@ char ixgbe_driver_name[] = "ixgbe";
 static const char ixgbe_driver_string[] =
                              "Intel(R) 10 Gigabit PCI Express Network Driver";
 
-#define DRV_VERSION "2.0.84-k2"
+#define DRV_VERSION "3.0.12-k2"
 const char ixgbe_driver_version[] = DRV_VERSION;
 static char ixgbe_copyright[] = "Copyright (c) 1999-2010 Intel Corporation.";
 
 static const struct ixgbe_info *ixgbe_info_tbl[] = {
        [board_82598] = &ixgbe_82598_info,
        [board_82599] = &ixgbe_82599_info,
+       [board_X540] = &ixgbe_X540_info,
 };
 
 /* ixgbe_pci_tbl - PCI Device ID Table
@@ -112,6 +113,8 @@ static DEFINE_PCI_DEVICE_TABLE(ixgbe_pci_tbl) = {
         board_82599 },
        {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_COMBO_BACKPLANE),
         board_82599 },
+       {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X540T),
+        board_82599 },
 
        /* required last entry */
        {0, }
@@ -560,6 +563,7 @@ static void ixgbe_set_ivar(struct ixgbe_adapter *adapter, s8 direction,
                IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                if (direction == -1) {
                        /* other causes */
                        msix_vector |= IXGBE_IVAR_ALLOC_VAL;
@@ -595,6 +599,7 @@ static inline void ixgbe_irq_rearm_queues(struct ixgbe_adapter *adapter,
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                mask = (qmask & 0xFFFFFFFF);
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
                mask = (qmask >> 32);
@@ -630,93 +635,166 @@ void ixgbe_unmap_and_free_tx_resource(struct ixgbe_ring *tx_ring,
 }
 
 /**
- * ixgbe_tx_xon_state - check the tx ring xon state
- * @adapter: the ixgbe adapter
- * @tx_ring: the corresponding tx_ring
+ * ixgbe_dcb_txq_to_tc - convert a reg index to a traffic class
+ * @adapter: driver private struct
+ * @index: reg idx of queue to query (0-127)
  *
- * If not in DCB mode, checks TFCS.TXOFF, otherwise, find out the
- * corresponding TC of this tx_ring when checking TFCS.
+ * Helper function to determine the traffic index for a paticular
+ * register index.
  *
- * Returns : true if in xon state (currently not paused)
+ * Returns : a tc index for use in range 0-7, or 0-3
  */
-static inline bool ixgbe_tx_xon_state(struct ixgbe_adapter *adapter,
-                                     struct ixgbe_ring *tx_ring)
+u8 ixgbe_dcb_txq_to_tc(struct ixgbe_adapter *adapter, u8 reg_idx)
 {
-       u32 txoff = IXGBE_TFCS_TXOFF;
+       int tc = -1;
+       int dcb_i = adapter->ring_feature[RING_F_DCB].indices;
 
-#ifdef CONFIG_IXGBE_DCB
-       if (adapter->dcb_cfg.pfc_mode_enable) {
-               int tc;
-               int dcb_i = adapter->ring_feature[RING_F_DCB].indices;
-               u8 reg_idx = tx_ring->reg_idx;
+       /* if DCB is not enabled the queues have no TC */
+       if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
+               return tc;
 
-               switch (adapter->hw.mac.type) {
-               case ixgbe_mac_82598EB:
-                       tc = reg_idx >> 2;
-                       txoff = IXGBE_TFCS_TXOFF0;
+       /* check valid range */
+       if (reg_idx >= adapter->hw.mac.max_tx_queues)
+               return tc;
+
+       switch (adapter->hw.mac.type) {
+       case ixgbe_mac_82598EB:
+               tc = reg_idx >> 2;
+               break;
+       default:
+               if (dcb_i != 4 && dcb_i != 8)
                        break;
-               case ixgbe_mac_82599EB:
-                       tc = 0;
-                       txoff = IXGBE_TFCS_TXOFF;
-                       if (dcb_i == 8) {
-                               /* TC0, TC1 */
-                               tc = reg_idx >> 5;
-                               if (tc == 2) /* TC2, TC3 */
-                                       tc += (reg_idx - 64) >> 4;
-                               else if (tc == 3) /* TC4, TC5, TC6, TC7 */
-                                       tc += 1 + ((reg_idx - 96) >> 3);
-                       } else if (dcb_i == 4) {
-                               /* TC0, TC1 */
-                               tc = reg_idx >> 6;
-                               if (tc == 1) {
-                                       tc += (reg_idx - 64) >> 5;
-                                       if (tc == 2) /* TC2, TC3 */
-                                               tc += (reg_idx - 96) >> 4;
-                               }
-                       }
+
+               /* if VMDq is enabled the lowest order bits determine TC */
+               if (adapter->flags & (IXGBE_FLAG_SRIOV_ENABLED |
+                                     IXGBE_FLAG_VMDQ_ENABLED)) {
+                       tc = reg_idx & (dcb_i - 1);
+                       break;
+               }
+
+               /*
+                * Convert the reg_idx into the correct TC. This bitmask
+                * targets the last full 32 ring traffic class and assigns
+                * it a value of 1. From there the rest of the rings are
+                * based on shifting the mask further up to include the
+                * reg_idx / 16 and then reg_idx / 8. It assumes dcB_i
+                * will only ever be 8 or 4 and that reg_idx will never
+                * be greater then 128. The code without the power of 2
+                * optimizations would be:
+                * (((reg_idx % 32) + 32) * dcb_i) >> (9 - reg_idx / 32)
+                */
+               tc = ((reg_idx & 0X1F) + 0x20) * dcb_i;
+               tc >>= 9 - (reg_idx >> 5);
+       }
+
+       return tc;
+}
+
+static void ixgbe_update_xoff_received(struct ixgbe_adapter *adapter)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+       struct ixgbe_hw_stats *hwstats = &adapter->stats;
+       u32 data = 0;
+       u32 xoff[8] = {0};
+       int i;
+
+       if ((hw->fc.current_mode == ixgbe_fc_full) ||
+           (hw->fc.current_mode == ixgbe_fc_rx_pause)) {
+               switch (hw->mac.type) {
+               case ixgbe_mac_82598EB:
+                       data = IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
                        break;
                default:
-                       tc = 0;
+                       data = IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
+               }
+               hwstats->lxoffrxc += data;
+
+               /* refill credits (no tx hang) if we received xoff */
+               if (!data)
+                       return;
+
+               for (i = 0; i < adapter->num_tx_queues; i++)
+                       clear_bit(__IXGBE_HANG_CHECK_ARMED,
+                                 &adapter->tx_ring[i]->state);
+               return;
+       } else if (!(adapter->dcb_cfg.pfc_mode_enable))
+               return;
+
+       /* update stats for each tc, only valid with PFC enabled */
+       for (i = 0; i < MAX_TX_PACKET_BUFFERS; i++) {
+               switch (hw->mac.type) {
+               case ixgbe_mac_82598EB:
+                       xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
                        break;
+               default:
+                       xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));
                }
-               txoff <<= tc;
+               hwstats->pxoffrxc[i] += xoff[i];
        }
-#endif
-       return IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & txoff;
+
+       /* disarm tx queues that have received xoff frames */
+       for (i = 0; i < adapter->num_tx_queues; i++) {
+               struct ixgbe_ring *tx_ring = adapter->tx_ring[i];
+               u32 tc = ixgbe_dcb_txq_to_tc(adapter, tx_ring->reg_idx);
+
+               if (xoff[tc])
+                       clear_bit(__IXGBE_HANG_CHECK_ARMED, &tx_ring->state);
+       }
+}
+
+static u64 ixgbe_get_tx_completed(struct ixgbe_ring *ring)
+{
+       return ring->tx_stats.completed;
 }
 
-static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter,
-                                      struct ixgbe_ring *tx_ring,
-                                      unsigned int eop)
+static u64 ixgbe_get_tx_pending(struct ixgbe_ring *ring)
 {
+       struct ixgbe_adapter *adapter = netdev_priv(ring->netdev);
        struct ixgbe_hw *hw = &adapter->hw;
 
-       /* Detect a transmit hang in hardware, this serializes the
-        * check with the clearing of time_stamp and movement of eop */
+       u32 head = IXGBE_READ_REG(hw, IXGBE_TDH(ring->reg_idx));
+       u32 tail = IXGBE_READ_REG(hw, IXGBE_TDT(ring->reg_idx));
+
+       if (head != tail)
+               return (head < tail) ?
+                       tail - head : (tail + ring->count - head);
+
+       return 0;
+}
+
+static inline bool ixgbe_check_tx_hang(struct ixgbe_ring *tx_ring)
+{
+       u32 tx_done = ixgbe_get_tx_completed(tx_ring);
+       u32 tx_done_old = tx_ring->tx_stats.tx_done_old;
+       u32 tx_pending = ixgbe_get_tx_pending(tx_ring);
+       bool ret = false;
+
        clear_check_for_tx_hang(tx_ring);
-       if (tx_ring->tx_buffer_info[eop].time_stamp &&
-           time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ) &&
-           ixgbe_tx_xon_state(adapter, tx_ring)) {
-               /* detected Tx unit hang */
-               union ixgbe_adv_tx_desc *tx_desc;
-               tx_desc = IXGBE_TX_DESC_ADV(tx_ring, eop);
-               e_err(drv, "Detected Tx Unit Hang\n"
-                     "  Tx Queue             <%d>\n"
-                     "  TDH, TDT             <%x>, <%x>\n"
-                     "  next_to_use          <%x>\n"
-                     "  next_to_clean        <%x>\n"
-                     "tx_buffer_info[next_to_clean]\n"
-                     "  time_stamp           <%lx>\n"
-                     "  jiffies              <%lx>\n",
-                     tx_ring->queue_index,
-                     IXGBE_READ_REG(hw, IXGBE_TDH(tx_ring->reg_idx)),
-                     IXGBE_READ_REG(hw, IXGBE_TDT(tx_ring->reg_idx)),
-                     tx_ring->next_to_use, eop,
-                     tx_ring->tx_buffer_info[eop].time_stamp, jiffies);
-               return true;
+
+       /*
+        * Check for a hung queue, but be thorough. This verifies
+        * that a transmit has been completed since the previous
+        * check AND there is at least one packet pending. The
+        * ARMED bit is set to indicate a potential hang. The
+        * bit is cleared if a pause frame is received to remove
+        * false hang detection due to PFC or 802.3x frames. By
+        * requiring this to fail twice we avoid races with
+        * pfc clearing the ARMED bit and conditions where we
+        * run the check_tx_hang logic with a transmit completion
+        * pending but without time to complete it yet.
+        */
+       if ((tx_done_old == tx_done) && tx_pending) {
+               /* make sure it is true for two checks in a row */
+               ret = test_and_set_bit(__IXGBE_HANG_CHECK_ARMED,
+                                      &tx_ring->state);
+       } else {
+               /* update completed stats and continue */
+               tx_ring->tx_stats.tx_done_old = tx_done;
+               /* reset the countdown */
+               clear_bit(__IXGBE_HANG_CHECK_ARMED, &tx_ring->state);
        }
 
-       return false;
+       return ret;
 }
 
 #define IXGBE_MAX_TXD_PWR       14
@@ -772,6 +850,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
                                                         tx_buffer_info);
                }
 
+               tx_ring->tx_stats.completed++;
                eop = tx_ring->tx_buffer_info[i].next_to_watch;
                eop_desc = IXGBE_TX_DESC_ADV(tx_ring, eop);
        }
@@ -784,11 +863,31 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
        tx_ring->stats.bytes += total_bytes;
        u64_stats_update_end(&tx_ring->syncp);
 
-       if (check_for_tx_hang(tx_ring) &&
-           ixgbe_check_tx_hang(adapter, tx_ring, i)) {
+       if (check_for_tx_hang(tx_ring) && ixgbe_check_tx_hang(tx_ring)) {
+               /* schedule immediate reset if we believe we hung */
+               struct ixgbe_hw *hw = &adapter->hw;
+               tx_desc = IXGBE_TX_DESC_ADV(tx_ring, eop);
+               e_err(drv, "Detected Tx Unit Hang\n"
+                       "  Tx Queue             <%d>\n"
+                       "  TDH, TDT             <%x>, <%x>\n"
+                       "  next_to_use          <%x>\n"
+                       "  next_to_clean        <%x>\n"
+                       "tx_buffer_info[next_to_clean]\n"
+                       "  time_stamp           <%lx>\n"
+                       "  jiffies              <%lx>\n",
+                       tx_ring->queue_index,
+                       IXGBE_READ_REG(hw, IXGBE_TDH(tx_ring->reg_idx)),
+                       IXGBE_READ_REG(hw, IXGBE_TDT(tx_ring->reg_idx)),
+                       tx_ring->next_to_use, eop,
+                       tx_ring->tx_buffer_info[eop].time_stamp, jiffies);
+
+               netif_stop_subqueue(tx_ring->netdev, tx_ring->queue_index);
+
+               e_info(probe,
+                      "tx hang %d detected on queue %d, resetting adapter\n",
+                       adapter->tx_timeout_count + 1, tx_ring->queue_index);
+
                /* schedule immediate reset if we believe we hung */
-               e_info(probe, "tx hang %d detected, resetting "
-                      "adapter\n", adapter->tx_timeout_count + 1);
                ixgbe_tx_timeout(adapter->netdev);
 
                /* the adapter is about to reset, no point in enabling stuff */
@@ -828,6 +927,7 @@ static void ixgbe_update_rx_dca(struct ixgbe_adapter *adapter,
                rxctrl |= dca3_get_tag(&adapter->pdev->dev, cpu);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                rxctrl &= ~IXGBE_DCA_RXCTRL_CPUID_MASK_82599;
                rxctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) <<
                           IXGBE_DCA_RXCTRL_CPUID_SHIFT_82599);
@@ -861,6 +961,7 @@ static void ixgbe_update_tx_dca(struct ixgbe_adapter *adapter,
                IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(reg_idx), txctrl);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(reg_idx));
                txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599;
                txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) <<
@@ -1486,6 +1587,7 @@ static void ixgbe_configure_msix(struct ixgbe_adapter *adapter)
                               v_idx);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                ixgbe_set_ivar(adapter, -1, 1, v_idx);
                break;
 
@@ -1593,8 +1695,9 @@ void ixgbe_write_eitr(struct ixgbe_q_vector *q_vector)
                itr_reg |= (itr_reg << 16);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                /*
-                * 82599 can support a value of zero, so allow it for
+                * 82599 and X540 can support a value of zero, so allow it for
                 * max interrupt rate, but there is an errata where it can
                 * not be zero with RSC
                 */
@@ -1790,6 +1893,7 @@ static irqreturn_t ixgbe_msix_lsc(int irq, void *data)
 
        switch (hw->mac.type) {
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                /* Handle Flow Director Full threshold interrupt */
                if (eicr & IXGBE_EICR_FLOW_DIR) {
                        int i;
@@ -1835,6 +1939,7 @@ static inline void ixgbe_irq_enable_queues(struct ixgbe_adapter *adapter,
                IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                mask = (qmask & 0xFFFFFFFF);
                if (mask)
                        IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
@@ -1860,6 +1965,7 @@ static inline void ixgbe_irq_disable_queues(struct ixgbe_adapter *adapter,
                IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                mask = (qmask & 0xFFFFFFFF);
                if (mask)
                        IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
@@ -2113,18 +2219,22 @@ static inline void map_vector_to_rxq(struct ixgbe_adapter *a, int v_idx,
                                     int r_idx)
 {
        struct ixgbe_q_vector *q_vector = a->q_vector[v_idx];
+       struct ixgbe_ring *rx_ring = a->rx_ring[r_idx];
 
        set_bit(r_idx, q_vector->rxr_idx);
        q_vector->rxr_count++;
+       rx_ring->q_vector = q_vector;
 }
 
 static inline void map_vector_to_txq(struct ixgbe_adapter *a, int v_idx,
                                     int t_idx)
 {
        struct ixgbe_q_vector *q_vector = a->q_vector[v_idx];
+       struct ixgbe_ring *tx_ring = a->tx_ring[t_idx];
 
        set_bit(t_idx, q_vector->txr_idx);
        q_vector->txr_count++;
+       tx_ring->q_vector = q_vector;
 }
 
 /**
@@ -2328,6 +2438,7 @@ static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter, bool queues,
                mask |= IXGBE_EIMS_GPI_SDP1;
        switch (adapter->hw.mac.type) {
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                mask |= IXGBE_EIMS_ECC;
                mask |= IXGBE_EIMS_GPI_SDP1;
                mask |= IXGBE_EIMS_GPI_SDP2;
@@ -2393,6 +2504,7 @@ static irqreturn_t ixgbe_intr(int irq, void *data)
 
        switch (hw->mac.type) {
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                ixgbe_check_sfp_event(adapter, eicr);
                if ((adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE) &&
                    ((eicr & IXGBE_EICR_GPI_SDP0) || (eicr & IXGBE_EICR_LSC))) {
@@ -2502,6 +2614,7 @@ static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter)
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000);
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0);
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0);
@@ -2595,6 +2708,8 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,
                ring->atr_sample_rate = 0;
        }
 
+       clear_bit(__IXGBE_HANG_CHECK_ARMED, &ring->state);
+
        /* enable queue */
        txdctl |= IXGBE_TXDCTL_ENABLE;
        IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(reg_idx), txdctl);
@@ -2694,6 +2809,7 @@ static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter,
        }
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
        default:
                break;
        }
@@ -2790,12 +2906,29 @@ static void ixgbe_setup_mrqc(struct ixgbe_adapter *adapter)
        IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
 }
 
+/**
+ * ixgbe_clear_rscctl - disable RSC for the indicated ring
+ * @adapter: address of board private structure
+ * @ring: structure containing ring specific data
+ **/
+void ixgbe_clear_rscctl(struct ixgbe_adapter *adapter,
+                        struct ixgbe_ring *ring)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+       u32 rscctrl;
+       u8 reg_idx = ring->reg_idx;
+
+       rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(reg_idx));
+       rscctrl &= ~IXGBE_RSCCTL_RSCEN;
+       IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(reg_idx), rscctrl);
+}
+
 /**
  * ixgbe_configure_rscctl - enable RSC for the indicated ring
  * @adapter:    address of board private structure
  * @index:      index of ring to set
  **/
-static void ixgbe_configure_rscctl(struct ixgbe_adapter *adapter,
+void ixgbe_configure_rscctl(struct ixgbe_adapter *adapter,
                                   struct ixgbe_ring *ring)
 {
        struct ixgbe_hw *hw = &adapter->hw;
@@ -3100,6 +3233,7 @@ static void ixgbe_setup_rdrxctl(struct ixgbe_adapter *adapter)
                rdrxctl |= IXGBE_RDRXCTL_MVMEN;
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                /* Disable RSC for ACK packets */
                IXGBE_WRITE_REG(hw, IXGBE_RSCDBU,
                   (IXGBE_RSCDBU_RSCACKDIS | IXGBE_READ_REG(hw, IXGBE_RSCDBU)));
@@ -3227,6 +3361,7 @@ static void ixgbe_vlan_strip_disable(struct ixgbe_adapter *adapter)
                IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                for (i = 0; i < adapter->num_rx_queues; i++) {
                        j = adapter->rx_ring[i]->reg_idx;
                        vlnctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(j));
@@ -3256,6 +3391,7 @@ static void ixgbe_vlan_strip_enable(struct ixgbe_adapter *adapter)
                IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                for (i = 0; i < adapter->num_rx_queues; i++) {
                        j = adapter->rx_ring[i]->reg_idx;
                        vlnctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(j));
@@ -3611,8 +3747,9 @@ static void ixgbe_setup_gpie(struct ixgbe_adapter *adapter)
                case ixgbe_mac_82598EB:
                        IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
                        break;
-               default:
                case ixgbe_mac_82599EB:
+               case ixgbe_mac_X540:
+               default:
                        IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
                        IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
                        break;
@@ -3657,7 +3794,7 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
                ixgbe_configure_msi_and_legacy(adapter);
 
        /* enable the optics */
-       if (hw->phy.multispeed_fiber)
+       if (hw->phy.multispeed_fiber && hw->mac.ops.enable_tx_laser)
                hw->mac.ops.enable_tx_laser(hw);
 
        clear_bit(__IXGBE_DOWN, &adapter->state);
@@ -3960,6 +4097,7 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
        /* Disable the Tx DMA engine on 82599 */
        switch (hw->mac.type) {
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL,
                                (IXGBE_READ_REG(hw, IXGBE_DMATXCTL) &
                                 ~IXGBE_DMATXCTL_TE));
@@ -3969,7 +4107,7 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
        }
 
        /* power down the optics */
-       if (hw->phy.multispeed_fiber)
+       if (hw->phy.multispeed_fiber && hw->mac.ops.disable_tx_laser)
                hw->mac.ops.disable_tx_laser(hw);
 
        /* clear n-tuple filters that are cached */
@@ -4030,6 +4168,8 @@ static void ixgbe_tx_timeout(struct net_device *netdev)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
 
+       adapter->tx_timeout_count++;
+
        /* Do the reset outside of interrupt context */
        schedule_work(&adapter->reset_task);
 }
@@ -4044,8 +4184,6 @@ static void ixgbe_reset_task(struct work_struct *work)
            test_bit(__IXGBE_RESETTING, &adapter->state))
                return;
 
-       adapter->tx_timeout_count++;
-
        ixgbe_dump(adapter);
        netdev_err(adapter->netdev, "Reset adapter\n");
        ixgbe_reinit_locked(adapter);
@@ -4334,6 +4472,7 @@ static inline bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter)
                ret = true;
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                if (dcb_i == 8) {
                        /*
                         * Tx TC0 starts at: descriptor queue 0
@@ -4537,71 +4676,55 @@ static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
  **/
 static int ixgbe_alloc_queues(struct ixgbe_adapter *adapter)
 {
-       int i;
-       int rx_count;
-       int orig_node = adapter->node;
+       int rx = 0, tx = 0, nid = adapter->node;
 
-       for (i = 0; i < adapter->num_tx_queues; i++) {
-               struct ixgbe_ring *ring = adapter->tx_ring[i];
-               if (orig_node == -1) {
-                       int cur_node = next_online_node(adapter->node);
-                       if (cur_node == MAX_NUMNODES)
-                               cur_node = first_online_node;
-                       adapter->node = cur_node;
-               }
-               ring = kzalloc_node(sizeof(struct ixgbe_ring), GFP_KERNEL,
-                                   adapter->node);
+       if (nid < 0 || !node_online(nid))
+               nid = first_online_node;
+
+       for (; tx < adapter->num_tx_queues; tx++) {
+               struct ixgbe_ring *ring;
+
+               ring = kzalloc_node(sizeof(*ring), GFP_KERNEL, nid);
                if (!ring)
-                       ring = kzalloc(sizeof(struct ixgbe_ring), GFP_KERNEL);
+                       ring = kzalloc(sizeof(*ring), GFP_KERNEL);
                if (!ring)
-                       goto err_tx_ring_allocation;
+                       goto err_allocation;
                ring->count = adapter->tx_ring_count;
-               ring->queue_index = i;
+               ring->queue_index = tx;
+               ring->numa_node = nid;
                ring->dev = &adapter->pdev->dev;
                ring->netdev = adapter->netdev;
-               ring->numa_node = adapter->node;
 
-               adapter->tx_ring[i] = ring;
+               adapter->tx_ring[tx] = ring;
        }
 
-       /* Restore the adapter's original node */
-       adapter->node = orig_node;
+       for (; rx < adapter->num_rx_queues; rx++) {
+               struct ixgbe_ring *ring;
 
-       rx_count = adapter->rx_ring_count;
-       for (i = 0; i < adapter->num_rx_queues; i++) {
-               struct ixgbe_ring *ring = adapter->rx_ring[i];
-               if (orig_node == -1) {
-                       int cur_node = next_online_node(adapter->node);
-                       if (cur_node == MAX_NUMNODES)
-                               cur_node = first_online_node;
-                       adapter->node = cur_node;
-               }
-               ring = kzalloc_node(sizeof(struct ixgbe_ring), GFP_KERNEL,
-                                   adapter->node);
+               ring = kzalloc_node(sizeof(*ring), GFP_KERNEL, nid);
                if (!ring)
-                       ring = kzalloc(sizeof(struct ixgbe_ring), GFP_KERNEL);
+                       ring = kzalloc(sizeof(*ring), GFP_KERNEL);
                if (!ring)
-                       goto err_rx_ring_allocation;
-               ring->count = rx_count;
-               ring->queue_index = i;
+                       goto err_allocation;
+               ring->count = adapter->rx_ring_count;
+               ring->queue_index = rx;
+               ring->numa_node = nid;
                ring->dev = &adapter->pdev->dev;
                ring->netdev = adapter->netdev;
-               ring->numa_node = adapter->node;
 
-               adapter->rx_ring[i] = ring;
+               adapter->rx_ring[rx] = ring;
        }
 
-       /* Restore the adapter's original node */
-       adapter->node = orig_node;
-
        ixgbe_cache_ring_register(adapter);
 
        return 0;
 
-err_rx_ring_allocation:
-       for (i = 0; i < adapter->num_tx_queues; i++)
-               kfree(adapter->tx_ring[i]);
-err_tx_ring_allocation:
+err_allocation:
+       while (tx)
+               kfree(adapter->tx_ring[--tx]);
+
+       while (rx)
+               kfree(adapter->rx_ring[--rx]);
        return -ENOMEM;
 }
 
@@ -4948,6 +5071,7 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
                adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82598;
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82599;
                adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE;
                adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED;
@@ -5466,6 +5590,7 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)
                pci_wake_from_d3(pdev, false);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                pci_wake_from_d3(pdev, !!wufc);
                break;
        default:
@@ -5593,14 +5718,11 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
                case ixgbe_mac_82598EB:
                        hwstats->pxonrxc[i] +=
                                IXGBE_READ_REG(hw, IXGBE_PXONRXC(i));
-                       hwstats->pxoffrxc[i] +=
-                               IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
                        break;
                case ixgbe_mac_82599EB:
+               case ixgbe_mac_X540:
                        hwstats->pxonrxc[i] +=
                                IXGBE_READ_REG(hw, IXGBE_PXONRXCNT(i));
-                       hwstats->pxoffrxc[i] +=
-                               IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));
                        break;
                default:
                        break;
@@ -5612,16 +5734,18 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
        /* work around hardware counting issue */
        hwstats->gprc -= missed_rx;
 
+       ixgbe_update_xoff_received(adapter);
+
        /* 82598 hardware only has a 32 bit counter in the high register */
        switch (hw->mac.type) {
        case ixgbe_mac_82598EB:
                hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
-               hwstats->lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
                hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
                hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
                hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORH);
                break;
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCL);
                IXGBE_READ_REG(hw, IXGBE_GORCH); /* to clear */
                hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL);
@@ -5629,7 +5753,6 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
                hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORL);
                IXGBE_READ_REG(hw, IXGBE_TORH); /* to clear */
                hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
-               hwstats->lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
                hwstats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH);
                hwstats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS);
 #ifdef IXGBE_FCOE
@@ -5886,7 +6009,8 @@ static void ixgbe_watchdog_task(struct work_struct *work)
                                flow_tx = !!(rmcs & IXGBE_RMCS_TFCE_802_3X);
                        }
                                break;
-                       case ixgbe_mac_82599EB: {
+                       case ixgbe_mac_82599EB:
+                       case ixgbe_mac_X540: {
                                u32 mflcn = IXGBE_READ_REG(hw, IXGBE_MFLCN);
                                u32 fccfg = IXGBE_READ_REG(hw, IXGBE_FCCFG);
                                flow_rx = !!(mflcn & IXGBE_MFLCN_RFCE);
@@ -6960,8 +7084,14 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
                goto err_sw_init;
 
        /* Make it possible the adapter to be woken up via WOL */
-       if (adapter->hw.mac.type == ixgbe_mac_82599EB)
+       switch (adapter->hw.mac.type) {
+       case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_WUS, ~0);
+               break;
+       default:
+               break;
+       }
 
        /*
         * If there is a fan on this device and it has failed log the
@@ -7070,7 +7200,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
        }
 
        /* power down the optics */
-       if (hw->phy.multispeed_fiber)
+       if (hw->phy.multispeed_fiber && hw->mac.ops.disable_tx_laser)
                hw->mac.ops.disable_tx_laser(hw);
 
        init_timer(&adapter->watchdog_timer);