ixgbe: Add function for obtaining FCoE TC based on FCoE user priority
[deliverable/linux.git] / drivers / net / ethernet / intel / ixgbe / ixgbe_main.c
index 18ca3bcadf0cc10d152528654b41edcaab13f1df..3d7ce7e236e184e235a87a33cc4b5a0a6749c2df 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]);
        }
@@ -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) &&
@@ -1834,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;
@@ -1849,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];
 
@@ -2413,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];
 
@@ -2572,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);
 }
 
 /**
@@ -2619,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);
        }
@@ -2858,40 +2847,34 @@ static void ixgbe_set_rx_drop_en(struct ixgbe_adapter *adapter)
 static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter,
                                   struct ixgbe_ring *rx_ring)
 {
+       struct ixgbe_hw *hw = &adapter->hw;
        u32 srrctl;
        u8 reg_idx = rx_ring->reg_idx;
 
-       switch (adapter->hw.mac.type) {
-       case ixgbe_mac_82598EB: {
-               struct ixgbe_ring_feature *feature = adapter->ring_feature;
-               const int mask = feature[RING_F_RSS].mask;
-               reg_idx = reg_idx & mask;
-       }
-               break;
-       case ixgbe_mac_82599EB:
-       case ixgbe_mac_X540:
-       default:
-               break;
-       }
-
-       srrctl = IXGBE_READ_REG(&adapter->hw, IXGBE_SRRCTL(reg_idx));
+       if (hw->mac.type == ixgbe_mac_82598EB) {
+               u16 mask = adapter->ring_feature[RING_F_RSS].mask;
 
-       srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
-       srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
-       if (adapter->num_vfs)
-               srrctl |= IXGBE_SRRCTL_DROP_EN;
+               /*
+                * if VMDq is not active we must program one srrctl register
+                * per RSS queue since we have enabled RDRXCTL.MVMEN
+                */
+               reg_idx &= mask;
+       }
 
-       srrctl |= (IXGBE_RX_HDR_SIZE << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &
-                 IXGBE_SRRCTL_BSIZEHDR_MASK;
+       /* configure header buffer length, needed for RSC */
+       srrctl = IXGBE_RX_HDR_SIZE << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT;
 
+       /* configure the packet buffer length */
 #if PAGE_SIZE > IXGBE_MAX_RXBUFFER
        srrctl |= IXGBE_MAX_RXBUFFER >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
 #else
        srrctl |= ixgbe_rx_bufsz(rx_ring) >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
 #endif
+
+       /* configure descriptor type */
        srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
 
-       IXGBE_WRITE_REG(&adapter->hw, IXGBE_SRRCTL(reg_idx), srrctl);
+       IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(reg_idx), srrctl);
 }
 
 static void ixgbe_setup_mrqc(struct ixgbe_adapter *adapter)
@@ -3564,37 +3547,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
  *
@@ -3661,11 +3628,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)
 {
@@ -3679,18 +3646,12 @@ static int ixgbe_hpbthresh(struct ixgbe_adapter *adapter, int pb)
 
 #ifdef IXGBE_FCOE
        /* FCoE traffic class uses FCOE jumbo frames */
-       if (dev->features & NETIF_F_FCOE_MTU) {
-               int fcoe_pb = 0;
-
-#ifdef CONFIG_IXGBE_DCB
-               fcoe_pb = netdev_get_prio_tc_map(dev, adapter->fcoe.up);
+       if ((dev->features & NETIF_F_FCOE_MTU) &&
+           (tc < IXGBE_FCOE_JUMBO_FRAME_SIZE) &&
+           (pb == ixgbe_fcoe_get_tc(adapter)))
+               tc = IXGBE_FCOE_JUMBO_FRAME_SIZE;
 
 #endif
-               if (fcoe_pb == pb && tc < IXGBE_FCOE_JUMBO_FRAME_SIZE)
-                       tc = IXGBE_FCOE_JUMBO_FRAME_SIZE;
-       }
-#endif
-
        /* Calculate delay value for device */
        switch (hw->mac.type) {
        case ixgbe_mac_X540:
@@ -3725,11 +3686,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)
 {
@@ -4413,18 +4374,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)
@@ -4432,13 +4393,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;
@@ -5246,7 +5206,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)
 {
@@ -5282,7 +5242,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
@@ -5316,7 +5276,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);
@@ -5330,8 +5290,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)
 {
@@ -5374,7 +5334,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)
 {
@@ -5434,7 +5394,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)
 {
@@ -5462,7 +5422,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)
 {
@@ -5511,7 +5471,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)
 {
@@ -5535,7 +5495,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)
 {
@@ -5602,7 +5562,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)
 {
@@ -6233,8 +6193,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
@@ -6389,17 +6355,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;
        }
@@ -6533,11 +6494,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);
        }
@@ -6594,8 +6552,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
@@ -6630,8 +6589,33 @@ 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_set_prio_tc_map - Configure netdev prio tc map
+ * @adapter: Pointer to adapter struct
+ *
+ * Populate the netdev user priority to tc map
+ */
+static void ixgbe_set_prio_tc_map(struct ixgbe_adapter *adapter)
+{
+       struct net_device *dev = adapter->netdev;
+       struct ixgbe_dcb_config *dcb_cfg = &adapter->dcb_cfg;
+       struct ieee_ets *ets = adapter->ixgbe_ieee_ets;
+       u8 prio;
+
+       for (prio = 0; prio < MAX_USER_PRIORITY; prio++) {
+               u8 tc = 0;
+
+               if (adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE)
+                       tc = ixgbe_dcb_get_tc_from_up(dcb_cfg, 0, prio);
+               else if (ets)
+                       tc = ets->prio_tc[prio];
+
+               netdev_set_prio_tc_map(dev, prio, tc);
+       }
+}
+
+/**
+ * ixgbe_setup_tc - configure net_device for multiple traffic classes
  *
  * @netdev: net device to configure
  * @tc: number of traffic classes to enable
@@ -6647,6 +6631,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 &&
@@ -6663,6 +6652,8 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)
 
        if (tc) {
                netdev_set_num_tc(dev, tc);
+               ixgbe_set_prio_tc_map(adapter);
+
                adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
                adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
 
@@ -6672,6 +6663,7 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)
                }
        } else {
                netdev_reset_tc(dev);
+
                if (adapter->hw.mac.type == ixgbe_mac_82598EB)
                        adapter->hw.fc.requested_mode = adapter->last_lfc_mode;
 
This page took 0.038051 seconds and 5 git commands to generate.