ixgbe: Add feature offset value to ring features
[linux-2.6-block.git] / drivers / net / ethernet / intel / ixgbe / ixgbe_main.c
index 17ad6a3c1be126f2d25cf7e8ce448a7385ec8fc2..3a807ffd5ce22474c65bb1aa3168434bc38e2d45 100644 (file)
@@ -516,7 +516,7 @@ static void ixgbe_get_hw_control(struct ixgbe_adapter *adapter)
                        ctrl_ext | IXGBE_CTRL_EXT_DRV_LOAD);
 }
 
-/*
+/**
  * ixgbe_set_ivar - set the IVAR registers, mapping interrupt causes to vectors
  * @adapter: pointer to adapter struct
  * @direction: 0 for Rx, 1 for Tx, -1 for other causes
@@ -790,12 +790,10 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
                total_packets += tx_buffer->gso_segs;
 
 #ifdef CONFIG_IXGBE_PTP
-               if (unlikely(tx_buffer->tx_flags &
-                            IXGBE_TX_FLAGS_TSTAMP))
-                       ixgbe_ptp_tx_hwtstamp(q_vector,
-                                             tx_buffer->skb);
-
+               if (unlikely(tx_buffer->tx_flags & IXGBE_TX_FLAGS_TSTAMP))
+                       ixgbe_ptp_tx_hwtstamp(q_vector, tx_buffer->skb);
 #endif
+
                /* free the skb */
                dev_kfree_skb_any(tx_buffer->skb);
 
@@ -995,7 +993,6 @@ out_no_update:
 
 static void ixgbe_setup_dca(struct ixgbe_adapter *adapter)
 {
-       int num_q_vectors;
        int i;
 
        if (!(adapter->flags & IXGBE_FLAG_DCA_ENABLED))
@@ -1004,12 +1001,7 @@ static void ixgbe_setup_dca(struct ixgbe_adapter *adapter)
        /* always use CB2 mode, difference is masked in the CB driver */
        IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_CTRL, 2);
 
-       if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED)
-               num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
-       else
-               num_q_vectors = 1;
-
-       for (i = 0; i < num_q_vectors; i++) {
+       for (i = 0; i < adapter->num_q_vectors; i++) {
                adapter->q_vector[i]->cpu = -1;
                ixgbe_update_dca(adapter->q_vector[i]);
        }
@@ -1058,17 +1050,17 @@ static inline void ixgbe_rx_hash(struct ixgbe_ring *ring,
 #ifdef IXGBE_FCOE
 /**
  * ixgbe_rx_is_fcoe - check the rx desc for incoming pkt type
- * @adapter: address of board private structure
+ * @ring: structure containing ring specific data
  * @rx_desc: advanced rx descriptor
  *
  * Returns : true if it is FCoE pkt
  */
-static inline bool ixgbe_rx_is_fcoe(struct ixgbe_adapter *adapter,
+static inline bool ixgbe_rx_is_fcoe(struct ixgbe_ring *ring,
                                    union ixgbe_adv_rx_desc *rx_desc)
 {
        __le16 pkt_info = rx_desc->wb.lower.lo_dword.hs_rss.pkt_info;
 
-       return (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) &&
+       return test_bit(__IXGBE_RX_FCOE, &ring->state) &&
               ((pkt_info & cpu_to_le16(IXGBE_RXDADV_PKTTYPE_ETQF_MASK)) ==
                (cpu_to_le16(IXGBE_ETQF_FILTER_FCOE <<
                             IXGBE_RXDADV_PKTTYPE_ETQF_SHIFT)));
@@ -1148,7 +1140,7 @@ static bool ixgbe_alloc_mapped_page(struct ixgbe_ring *rx_ring,
 
        /* alloc new page for storage */
        if (likely(!page)) {
-               page = alloc_pages(GFP_ATOMIC | __GFP_COLD,
+               page = alloc_pages(GFP_ATOMIC | __GFP_COLD | __GFP_COMP,
                                   ixgbe_rx_pg_order(rx_ring));
                if (unlikely(!page)) {
                        rx_ring->rx_stats.alloc_rx_page_failed++;
@@ -1399,8 +1391,7 @@ static void ixgbe_process_skb_fields(struct ixgbe_ring *rx_ring,
        ixgbe_rx_checksum(rx_ring, rx_desc, skb);
 
 #ifdef CONFIG_IXGBE_PTP
-       if (ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_TS))
-               ixgbe_ptp_rx_hwtstamp(rx_ring->q_vector, skb);
+       ixgbe_ptp_rx_hwtstamp(rx_ring->q_vector, rx_desc, skb);
 #endif
 
        if ((dev->features & NETIF_F_HW_VLAN_RX) &&
@@ -1549,6 +1540,12 @@ static bool ixgbe_cleanup_headers(struct ixgbe_ring *rx_ring,
                skb->truesize -= ixgbe_rx_bufsz(rx_ring);
        }
 
+#ifdef IXGBE_FCOE
+       /* do not attempt to pad FCoE Frames as this will disrupt DDP */
+       if (ixgbe_rx_is_fcoe(rx_ring, rx_desc))
+               return false;
+
+#endif
        /* if skb_pad returns an error the skb was freed */
        if (unlikely(skb->len < 60)) {
                int pad_len = 60 - skb->len;
@@ -1775,7 +1772,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 
 #ifdef IXGBE_FCOE
                /* if ddp, not passing to ULD unless for FCP_RSP or error */
-               if (ixgbe_rx_is_fcoe(adapter, rx_desc)) {
+               if (ixgbe_rx_is_fcoe(rx_ring, rx_desc)) {
                        ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb);
                        if (!ddp_bytes) {
                                dev_kfree_skb_any(skb);
@@ -1828,11 +1825,9 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 static void ixgbe_configure_msix(struct ixgbe_adapter *adapter)
 {
        struct ixgbe_q_vector *q_vector;
-       int q_vectors, v_idx;
+       int v_idx;
        u32 mask;
 
-       q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
-
        /* Populate MSIX to EITR Select */
        if (adapter->num_vfs > 32) {
                u32 eitrsel = (1 << (adapter->num_vfs - 32)) - 1;
@@ -1843,7 +1838,7 @@ static void ixgbe_configure_msix(struct ixgbe_adapter *adapter)
         * Populate the IVAR table and set the ITR values to the
         * corresponding register.
         */
-       for (v_idx = 0; v_idx < q_vectors; v_idx++) {
+       for (v_idx = 0; v_idx < adapter->num_q_vectors; v_idx++) {
                struct ixgbe_ring *ring;
                q_vector = adapter->q_vector[v_idx];
 
@@ -2407,11 +2402,10 @@ int ixgbe_poll(struct napi_struct *napi, int budget)
 static int ixgbe_request_msix_irqs(struct ixgbe_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
-       int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
        int vector, err;
        int ri = 0, ti = 0;
 
-       for (vector = 0; vector < q_vectors; vector++) {
+       for (vector = 0; vector < adapter->num_q_vectors; vector++) {
                struct ixgbe_q_vector *q_vector = adapter->q_vector[vector];
                struct msix_entry *entry = &adapter->msix_entries[vector];
 
@@ -2566,30 +2560,28 @@ static int ixgbe_request_irq(struct ixgbe_adapter *adapter)
 
 static void ixgbe_free_irq(struct ixgbe_adapter *adapter)
 {
-       if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
-               int i, q_vectors;
+       int vector;
 
-               q_vectors = adapter->num_msix_vectors;
-               i = q_vectors - 1;
-               free_irq(adapter->msix_entries[i].vector, adapter);
-               i--;
+       if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
+               free_irq(adapter->pdev->irq, adapter);
+               return;
+       }
 
-               for (; i >= 0; i--) {
-                       /* free only the irqs that were actually requested */
-                       if (!adapter->q_vector[i]->rx.ring &&
-                           !adapter->q_vector[i]->tx.ring)
-                               continue;
+       for (vector = 0; vector < adapter->num_q_vectors; vector++) {
+               struct ixgbe_q_vector *q_vector = adapter->q_vector[vector];
+               struct msix_entry *entry = &adapter->msix_entries[vector];
 
-                       /* clear the affinity_mask in the IRQ descriptor */
-                       irq_set_affinity_hint(adapter->msix_entries[i].vector,
-                                             NULL);
+               /* free only the irqs that were actually requested */
+               if (!q_vector->rx.ring && !q_vector->tx.ring)
+                       continue;
 
-                       free_irq(adapter->msix_entries[i].vector,
-                                adapter->q_vector[i]);
-               }
-       } else {
-               free_irq(adapter->pdev->irq, adapter);
+               /* clear the affinity_mask in the IRQ descriptor */
+               irq_set_affinity_hint(entry->vector, NULL);
+
+               free_irq(entry->vector, q_vector);
        }
+
+       free_irq(adapter->msix_entries[vector++].vector, adapter);
 }
 
 /**
@@ -2613,9 +2605,12 @@ static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter)
        }
        IXGBE_WRITE_FLUSH(&adapter->hw);
        if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
-               int i;
-               for (i = 0; i < adapter->num_msix_vectors; i++)
-                       synchronize_irq(adapter->msix_entries[i].vector);
+               int vector;
+
+               for (vector = 0; vector < adapter->num_q_vectors; vector++)
+                       synchronize_irq(adapter->msix_entries[vector].vector);
+
+               synchronize_irq(adapter->msix_entries[vector++].vector);
        } else {
                synchronize_irq(adapter->pdev->irq);
        }
@@ -3558,37 +3553,21 @@ void ixgbe_set_rx_mode(struct net_device *netdev)
 static void ixgbe_napi_enable_all(struct ixgbe_adapter *adapter)
 {
        int q_idx;
-       struct ixgbe_q_vector *q_vector;
-       int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
 
-       /* legacy and MSI only use one vector */
-       if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED))
-               q_vectors = 1;
-
-       for (q_idx = 0; q_idx < q_vectors; q_idx++) {
-               q_vector = adapter->q_vector[q_idx];
-               napi_enable(&q_vector->napi);
-       }
+       for (q_idx = 0; q_idx < adapter->num_q_vectors; q_idx++)
+               napi_enable(&adapter->q_vector[q_idx]->napi);
 }
 
 static void ixgbe_napi_disable_all(struct ixgbe_adapter *adapter)
 {
        int q_idx;
-       struct ixgbe_q_vector *q_vector;
-       int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
 
-       /* legacy and MSI only use one vector */
-       if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED))
-               q_vectors = 1;
-
-       for (q_idx = 0; q_idx < q_vectors; q_idx++) {
-               q_vector = adapter->q_vector[q_idx];
-               napi_disable(&q_vector->napi);
-       }
+       for (q_idx = 0; q_idx < adapter->num_q_vectors; q_idx++)
+               napi_disable(&adapter->q_vector[q_idx]->napi);
 }
 
 #ifdef CONFIG_IXGBE_DCB
-/*
+/**
  * ixgbe_configure_dcb - Configure DCB hardware
  * @adapter: ixgbe adapter struct
  *
@@ -3655,11 +3634,11 @@ static void ixgbe_configure_dcb(struct ixgbe_adapter *adapter)
 /* Additional bittime to account for IXGBE framing */
 #define IXGBE_ETH_FRAMING 20
 
-/*
+/**
  * ixgbe_hpbthresh - calculate high water mark for flow control
  *
  * @adapter: board private structure to calculate for
- * @pb - packet buffer to calculate
+ * @pb: packet buffer to calculate
  */
 static int ixgbe_hpbthresh(struct ixgbe_adapter *adapter, int pb)
 {
@@ -3719,11 +3698,11 @@ static int ixgbe_hpbthresh(struct ixgbe_adapter *adapter, int pb)
        return marker;
 }
 
-/*
+/**
  * ixgbe_lpbthresh - calculate low water mark for for flow control
  *
  * @adapter: board private structure to calculate for
- * @pb - packet buffer to calculate
+ * @pb: packet buffer to calculate
  */
 static int ixgbe_lpbthresh(struct ixgbe_adapter *adapter)
 {
@@ -4407,18 +4386,18 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
 
        /* Set capability flags */
        rss = min_t(int, IXGBE_MAX_RSS_INDICES, num_online_cpus());
-       adapter->ring_feature[RING_F_RSS].indices = rss;
+       adapter->ring_feature[RING_F_RSS].limit = rss;
        adapter->flags |= IXGBE_FLAG_RSS_ENABLED;
        switch (hw->mac.type) {
        case ixgbe_mac_82598EB:
                if (hw->device_id == IXGBE_DEV_ID_82598AT)
                        adapter->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE;
-               adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82598;
+               adapter->max_q_vectors = MAX_Q_VECTORS_82598;
                break;
        case ixgbe_mac_X540:
                adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE;
        case ixgbe_mac_82599EB:
-               adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82599;
+               adapter->max_q_vectors = MAX_Q_VECTORS_82599;
                adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE;
                adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED;
                if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM)
@@ -4426,13 +4405,12 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
                /* Flow Director hash filters enabled */
                adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
                adapter->atr_sample_rate = 20;
-               adapter->ring_feature[RING_F_FDIR].indices =
+               adapter->ring_feature[RING_F_FDIR].limit =
                                                         IXGBE_MAX_FDIR_INDICES;
                adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_64K;
 #ifdef IXGBE_FCOE
                adapter->flags |= IXGBE_FLAG_FCOE_CAPABLE;
                adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
-               adapter->ring_feature[RING_F_FCOE].indices = 0;
 #ifdef CONFIG_IXGBE_DCB
                /* Default traffic class to use for FCoE */
                adapter->fcoe.up = IXGBE_FCOE_DEFTC;
@@ -5240,7 +5218,7 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
 
 /**
  * ixgbe_fdir_reinit_subtask - worker thread to reinit FDIR filter table
- * @adapter - pointer to the device adapter structure
+ * @adapter: pointer to the device adapter structure
  **/
 static void ixgbe_fdir_reinit_subtask(struct ixgbe_adapter *adapter)
 {
@@ -5276,7 +5254,7 @@ static void ixgbe_fdir_reinit_subtask(struct ixgbe_adapter *adapter)
 
 /**
  * ixgbe_check_hang_subtask - check for hung queues and dropped interrupts
- * @adapter - pointer to the device adapter structure
+ * @adapter: pointer to the device adapter structure
  *
  * This function serves two purposes.  First it strobes the interrupt lines
  * in order to make certain interrupts are occurring.  Secondly it sets the
@@ -5310,7 +5288,7 @@ static void ixgbe_check_hang_subtask(struct ixgbe_adapter *adapter)
                        (IXGBE_EICS_TCP_TIMER | IXGBE_EICS_OTHER));
        } else {
                /* get one bit for every active tx/rx interrupt vector */
-               for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) {
+               for (i = 0; i < adapter->num_q_vectors; i++) {
                        struct ixgbe_q_vector *qv = adapter->q_vector[i];
                        if (qv->rx.ring || qv->tx.ring)
                                eics |= ((u64)1 << i);
@@ -5324,8 +5302,8 @@ static void ixgbe_check_hang_subtask(struct ixgbe_adapter *adapter)
 
 /**
  * ixgbe_watchdog_update_link - update the link status
- * @adapter - pointer to the device adapter structure
- * @link_speed - pointer to a u32 to store the link_speed
+ * @adapter: pointer to the device adapter structure
+ * @link_speed: pointer to a u32 to store the link_speed
  **/
 static void ixgbe_watchdog_update_link(struct ixgbe_adapter *adapter)
 {
@@ -5368,7 +5346,7 @@ static void ixgbe_watchdog_update_link(struct ixgbe_adapter *adapter)
 /**
  * ixgbe_watchdog_link_is_up - update netif_carrier status and
  *                             print link up message
- * @adapter - pointer to the device adapter structure
+ * @adapter: pointer to the device adapter structure
  **/
 static void ixgbe_watchdog_link_is_up(struct ixgbe_adapter *adapter)
 {
@@ -5428,7 +5406,7 @@ static void ixgbe_watchdog_link_is_up(struct ixgbe_adapter *adapter)
 /**
  * ixgbe_watchdog_link_is_down - update netif_carrier status and
  *                               print link down message
- * @adapter - pointer to the adapter structure
+ * @adapter: pointer to the adapter structure
  **/
 static void ixgbe_watchdog_link_is_down(struct ixgbe_adapter *adapter)
 {
@@ -5456,7 +5434,7 @@ static void ixgbe_watchdog_link_is_down(struct ixgbe_adapter *adapter)
 
 /**
  * ixgbe_watchdog_flush_tx - flush queues on link down
- * @adapter - pointer to the device adapter structure
+ * @adapter: pointer to the device adapter structure
  **/
 static void ixgbe_watchdog_flush_tx(struct ixgbe_adapter *adapter)
 {
@@ -5505,7 +5483,7 @@ static void ixgbe_spoof_check(struct ixgbe_adapter *adapter)
 
 /**
  * ixgbe_watchdog_subtask - check and bring link up
- * @adapter - pointer to the device adapter structure
+ * @adapter: pointer to the device adapter structure
  **/
 static void ixgbe_watchdog_subtask(struct ixgbe_adapter *adapter)
 {
@@ -5529,7 +5507,7 @@ static void ixgbe_watchdog_subtask(struct ixgbe_adapter *adapter)
 
 /**
  * ixgbe_sfp_detection_subtask - poll for SFP+ cable
- * @adapter - the ixgbe adapter structure
+ * @adapter: the ixgbe adapter structure
  **/
 static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
 {
@@ -5596,7 +5574,7 @@ sfp_out:
 
 /**
  * ixgbe_sfp_link_config_subtask - set up link SFP after module install
- * @adapter - the ixgbe adapter structure
+ * @adapter: the ixgbe adapter structure
  **/
 static void ixgbe_sfp_link_config_subtask(struct ixgbe_adapter *adapter)
 {
@@ -6227,8 +6205,14 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)
        if (((protocol == htons(ETH_P_FCOE)) ||
            (protocol == htons(ETH_P_FIP))) &&
            (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)) {
-               txq &= (adapter->ring_feature[RING_F_FCOE].indices - 1);
-               txq += adapter->ring_feature[RING_F_FCOE].mask;
+               struct ixgbe_ring_feature *f;
+
+               f = &adapter->ring_feature[RING_F_FCOE];
+
+               while (txq >= f->indices)
+                       txq -= f->indices;
+               txq += adapter->ring_feature[RING_F_FCOE].offset;
+
                return txq;
        }
 #endif
@@ -6383,17 +6367,12 @@ static netdev_tx_t ixgbe_xmit_frame(struct sk_buff *skb,
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_ring *tx_ring;
 
-       if (skb->len <= 0) {
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
-       }
-
        /*
         * The minimum packet size for olinfo paylen is 17 so pad the skb
         * in order to meet this minimum size requirement.
         */
-       if (skb->len < 17) {
-               if (skb_padto(skb, 17))
+       if (unlikely(skb->len < 17)) {
+               if (skb_pad(skb, 17 - skb->len))
                        return NETDEV_TX_OK;
                skb->len = 17;
        }
@@ -6527,11 +6506,8 @@ static void ixgbe_netpoll(struct net_device *netdev)
 
        adapter->flags |= IXGBE_FLAG_IN_NETPOLL;
        if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
-               int num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
-               for (i = 0; i < num_q_vectors; i++) {
-                       struct ixgbe_q_vector *q_vector = adapter->q_vector[i];
-                       ixgbe_msix_clean_rings(0, q_vector);
-               }
+               for (i = 0; i < adapter->num_q_vectors; i++)
+                       ixgbe_msix_clean_rings(0, adapter->q_vector[i]);
        } else {
                ixgbe_intr(adapter->pdev->irq, netdev);
        }
@@ -6588,8 +6564,9 @@ static struct rtnl_link_stats64 *ixgbe_get_stats64(struct net_device *netdev,
 }
 
 #ifdef CONFIG_IXGBE_DCB
-/* ixgbe_validate_rtr - verify 802.1Qp to Rx packet buffer mapping is valid.
- * #adapter: pointer to ixgbe_adapter
+/**
+ * ixgbe_validate_rtr - verify 802.1Qp to Rx packet buffer mapping is valid.
+ * @adapter: pointer to ixgbe_adapter
  * @tc: number of traffic classes currently enabled
  *
  * Configure a valid 802.1Qp to Rx packet buffer mapping ie confirm
@@ -6624,8 +6601,8 @@ static void ixgbe_validate_rtr(struct ixgbe_adapter *adapter, u8 tc)
        return;
 }
 
-/* ixgbe_setup_tc - routine to configure net_device for multiple traffic
- * classes.
+/**
+ * ixgbe_setup_tc - configure net_device for multiple traffic classes
  *
  * @netdev: net device to configure
  * @tc: number of traffic classes to enable
@@ -6641,6 +6618,11 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)
                return -EINVAL;
        }
 
+       if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
+               e_err(drv, "Enable failed, SR-IOV enabled\n");
+               return -EINVAL;
+       }
+
        /* Hardware supports up to 8 traffic classes */
        if (tc > adapter->dcb_cfg.num_tcs.pg_tcs ||
            (hw->mac.type == ixgbe_mac_82598EB &&