ixgbe: DCB, use multiple Tx rings per traffic class
[pandora-kernel.git] / drivers / net / ixgbe / ixgbe_main.c
index fbae703..3694226 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2010 Intel Corporation.
+  Copyright(c) 1999 - 2011 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -54,7 +54,8 @@ static const char ixgbe_driver_string[] =
 
 #define DRV_VERSION "3.2.9-k2"
 const char ixgbe_driver_version[] = DRV_VERSION;
-static char ixgbe_copyright[] = "Copyright (c) 1999-2010 Intel Corporation.";
+static const char ixgbe_copyright[] =
+                               "Copyright (c) 1999-2011 Intel Corporation.";
 
 static const struct ixgbe_info *ixgbe_info_tbl[] = {
        [board_82598] = &ixgbe_82598_info,
@@ -648,10 +649,10 @@ void ixgbe_unmap_and_free_tx_resource(struct ixgbe_ring *tx_ring,
  *
  * Returns : a tc index for use in range 0-7, or 0-3
  */
-u8 ixgbe_dcb_txq_to_tc(struct ixgbe_adapter *adapter, u8 reg_idx)
+static u8 ixgbe_dcb_txq_to_tc(struct ixgbe_adapter *adapter, u8 reg_idx)
 {
        int tc = -1;
-       int dcb_i = adapter->ring_feature[RING_F_DCB].indices;
+       int dcb_i = netdev_get_num_tc(adapter->netdev);
 
        /* if DCB is not enabled the queues have no TC */
        if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
@@ -2597,6 +2598,11 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter)
 
                i--;
                for (; i >= 0; i--) {
+                       /* free only the irqs that were actually requested */
+                       if (!adapter->q_vector[i]->rxr_count &&
+                           !adapter->q_vector[i]->txr_count)
+                               continue;
+
                        free_irq(adapter->msix_entries[i].vector,
                                 adapter->q_vector[i]);
                }
@@ -3077,6 +3083,14 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
        ixgbe_configure_srrctl(adapter, ring);
        ixgbe_configure_rscctl(adapter, ring);
 
+       /* If operating in IOV mode set RLPML for X540 */
+       if ((adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) &&
+           hw->mac.type == ixgbe_mac_X540) {
+               rxdctl &= ~IXGBE_RXDCTL_RLPMLMASK;
+               rxdctl |= ((ring->netdev->mtu + ETH_HLEN +
+                           ETH_FCS_LEN + VLAN_HLEN) | IXGBE_RXDCTL_RLPML_EN);
+       }
+
        if (hw->mac.type == ixgbe_mac_82598EB) {
                /*
                 * enable cache line friendly hardware writes:
@@ -3728,7 +3742,8 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter)
                         * We need to try and force an autonegotiation
                         * session, then bring up link.
                         */
-                       hw->mac.ops.setup_sfp(hw);
+                       if (hw->mac.ops.setup_sfp)
+                               hw->mac.ops.setup_sfp(hw);
                        if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
                                schedule_work(&adapter->multispeed_fiber_task);
                } else {
@@ -3760,7 +3775,8 @@ static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw)
        if (ret)
                goto link_cfg_out;
 
-       if (hw->mac.ops.get_link_capabilities)
+       autoneg = hw->phy.autoneg_advertised;
+       if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
                ret = hw->mac.ops.get_link_capabilities(hw, &autoneg,
                                                        &negotiation);
        if (ret)
@@ -3875,7 +3891,7 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
         * If we're not hot-pluggable SFP+, we just need to configure link
         * and bring it up.
         */
-       if (hw->phy.type == ixgbe_phy_unknown)
+       if (hw->phy.type == ixgbe_phy_none)
                schedule_work(&adapter->sfp_config_module_task);
 
        /* enable transmits */
@@ -4242,24 +4258,6 @@ static void ixgbe_reset_task(struct work_struct *work)
        ixgbe_reinit_locked(adapter);
 }
 
-#ifdef CONFIG_IXGBE_DCB
-static inline bool ixgbe_set_dcb_queues(struct ixgbe_adapter *adapter)
-{
-       bool ret = false;
-       struct ixgbe_ring_feature *f = &adapter->ring_feature[RING_F_DCB];
-
-       if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
-               return ret;
-
-       f->mask = 0x7 << 3;
-       adapter->num_rx_queues = f->indices;
-       adapter->num_tx_queues = f->indices;
-       ret = true;
-
-       return ret;
-}
-#endif
-
 /**
  * ixgbe_set_rss_queues: Allocate queues for RSS
  * @adapter: board private structure to initialize
@@ -4330,19 +4328,26 @@ static inline bool ixgbe_set_fdir_queues(struct ixgbe_adapter *adapter)
  **/
 static inline bool ixgbe_set_fcoe_queues(struct ixgbe_adapter *adapter)
 {
-       bool ret = false;
        struct ixgbe_ring_feature *f = &adapter->ring_feature[RING_F_FCOE];
 
-       f->indices = min((int)num_online_cpus(), f->indices);
-       if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) {
-               adapter->num_rx_queues = 1;
-               adapter->num_tx_queues = 1;
+       if (!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))
+               return false;
+
+       if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
 #ifdef CONFIG_IXGBE_DCB
-               if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
-                       e_info(probe, "FCoE enabled with DCB\n");
-                       ixgbe_set_dcb_queues(adapter);
-               }
+               int tc;
+               struct net_device *dev = adapter->netdev;
+
+               tc = netdev_get_prio_tc_map(dev, adapter->fcoe.up);
+               f->indices = dev->tc_to_txq[tc].count;
+               f->mask = dev->tc_to_txq[tc].offset;
 #endif
+       } else {
+               f->indices = min((int)num_online_cpus(), f->indices);
+
+               adapter->num_rx_queues = 1;
+               adapter->num_tx_queues = 1;
+
                if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) {
                        e_info(probe, "FCoE enabled with RSS\n");
                        if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ||
@@ -4355,14 +4360,45 @@ static inline bool ixgbe_set_fcoe_queues(struct ixgbe_adapter *adapter)
                f->mask = adapter->num_rx_queues;
                adapter->num_rx_queues += f->indices;
                adapter->num_tx_queues += f->indices;
+       }
 
-               ret = true;
+       return true;
+}
+#endif /* IXGBE_FCOE */
+
+#ifdef CONFIG_IXGBE_DCB
+static inline bool ixgbe_set_dcb_queues(struct ixgbe_adapter *adapter)
+{
+       bool ret = false;
+       struct ixgbe_ring_feature *f = &adapter->ring_feature[RING_F_DCB];
+       int i, q;
+
+       if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
+               return ret;
+
+       f->indices = 0;
+       for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
+               q = min((int)num_online_cpus(), MAX_TRAFFIC_CLASS);
+               f->indices += q;
        }
 
+       f->mask = 0x7 << 3;
+       adapter->num_rx_queues = f->indices;
+       adapter->num_tx_queues = f->indices;
+       ret = true;
+
+#ifdef IXGBE_FCOE
+       /* FCoE enabled queues require special configuration done through
+        * configure_fcoe() and others. Here we map FCoE indices onto the
+        * DCB queue pairs allowing FCoE to own configuration later.
+        */
+       ixgbe_set_fcoe_queues(adapter);
+#endif
+
        return ret;
 }
+#endif
 
-#endif /* IXGBE_FCOE */
 /**
  * ixgbe_set_sriov_queues: Allocate queues for IOV use
  * @adapter: board private structure to initialize
@@ -4398,16 +4434,16 @@ static int ixgbe_set_num_queues(struct ixgbe_adapter *adapter)
        if (ixgbe_set_sriov_queues(adapter))
                goto done;
 
-#ifdef IXGBE_FCOE
-       if (ixgbe_set_fcoe_queues(adapter))
-               goto done;
-
-#endif /* IXGBE_FCOE */
 #ifdef CONFIG_IXGBE_DCB
        if (ixgbe_set_dcb_queues(adapter))
                goto done;
 
 #endif
+#ifdef IXGBE_FCOE
+       if (ixgbe_set_fcoe_queues(adapter))
+               goto done;
+
+#endif /* IXGBE_FCOE */
        if (ixgbe_set_fdir_queues(adapter))
                goto done;
 
@@ -4499,6 +4535,91 @@ static inline bool ixgbe_cache_ring_rss(struct ixgbe_adapter *adapter)
 }
 
 #ifdef CONFIG_IXGBE_DCB
+
+/* ixgbe_get_first_reg_idx - Return first register index associated with ring */
+void ixgbe_get_first_reg_idx(struct ixgbe_adapter *adapter, u8 tc,
+                            unsigned int *tx, unsigned int *rx)
+{
+       struct net_device *dev = adapter->netdev;
+       struct ixgbe_hw *hw = &adapter->hw;
+       u8 num_tcs = netdev_get_num_tc(dev);
+
+       *tx = 0;
+       *rx = 0;
+
+       switch (hw->mac.type) {
+       case ixgbe_mac_82598EB:
+               *tx = tc << 3;
+               *rx = tc << 2;
+               break;
+       case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
+               if (num_tcs == 8) {
+                       if (tc < 3) {
+                               *tx = tc << 5;
+                               *rx = tc << 4;
+                       } else if (tc <  5) {
+                               *tx = ((tc + 2) << 4);
+                               *rx = tc << 4;
+                       } else if (tc < num_tcs) {
+                               *tx = ((tc + 8) << 3);
+                               *rx = tc << 4;
+                       }
+               } else if (num_tcs == 4) {
+                       *rx =  tc << 5;
+                       switch (tc) {
+                       case 0:
+                               *tx =  0;
+                               break;
+                       case 1:
+                               *tx = 64;
+                               break;
+                       case 2:
+                               *tx = 96;
+                               break;
+                       case 3:
+                               *tx = 112;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+               break;
+       default:
+               break;
+       }
+}
+
+#define IXGBE_MAX_Q_PER_TC     (IXGBE_MAX_DCB_INDICES / MAX_TRAFFIC_CLASS)
+
+/* ixgbe_setup_tc - routine to configure net_device for multiple traffic
+ * classes.
+ *
+ * @netdev: net device to configure
+ * @tc: number of traffic classes to enable
+ */
+int ixgbe_setup_tc(struct net_device *dev, u8 tc)
+{
+       int i;
+       unsigned int q, offset = 0;
+
+       if (!tc) {
+               netdev_reset_tc(dev);
+       } else {
+               if (netdev_set_num_tc(dev, tc))
+                       return -EINVAL;
+
+               /* Partition Tx queues evenly amongst traffic classes */
+               for (i = 0; i < tc; i++) {
+                       q = min((int)num_online_cpus(), IXGBE_MAX_Q_PER_TC);
+                       netdev_set_prio_tc_map(dev, i, i);
+                       netdev_set_tc_queue(dev, i, q, offset);
+                       offset += q;
+               }
+       }
+       return 0;
+}
+
 /**
  * ixgbe_cache_ring_dcb - Descriptor ring to register mapping for DCB
  * @adapter: board private structure to initialize
@@ -4508,72 +4629,27 @@ static inline bool ixgbe_cache_ring_rss(struct ixgbe_adapter *adapter)
  **/
 static inline bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter)
 {
-       int i;
-       bool ret = false;
-       int dcb_i = adapter->ring_feature[RING_F_DCB].indices;
+       struct net_device *dev = adapter->netdev;
+       int i, j, k;
+       u8 num_tcs = netdev_get_num_tc(dev);
 
        if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
                return false;
 
-       /* the number of queues is assumed to be symmetric */
-       switch (adapter->hw.mac.type) {
-       case ixgbe_mac_82598EB:
-               for (i = 0; i < dcb_i; i++) {
-                       adapter->rx_ring[i]->reg_idx = i << 3;
-                       adapter->tx_ring[i]->reg_idx = i << 2;
-               }
-               ret = true;
-               break;
-       case ixgbe_mac_82599EB:
-       case ixgbe_mac_X540:
-               if (dcb_i == 8) {
-                       /*
-                        * Tx TC0 starts at: descriptor queue 0
-                        * Tx TC1 starts at: descriptor queue 32
-                        * Tx TC2 starts at: descriptor queue 64
-                        * Tx TC3 starts at: descriptor queue 80
-                        * Tx TC4 starts at: descriptor queue 96
-                        * Tx TC5 starts at: descriptor queue 104
-                        * Tx TC6 starts at: descriptor queue 112
-                        * Tx TC7 starts at: descriptor queue 120
-                        *
-                        * Rx TC0-TC7 are offset by 16 queues each
-                        */
-                       for (i = 0; i < 3; i++) {
-                               adapter->tx_ring[i]->reg_idx = i << 5;
-                               adapter->rx_ring[i]->reg_idx = i << 4;
-                       }
-                       for ( ; i < 5; i++) {
-                               adapter->tx_ring[i]->reg_idx = ((i + 2) << 4);
-                               adapter->rx_ring[i]->reg_idx = i << 4;
-                       }
-                       for ( ; i < dcb_i; i++) {
-                               adapter->tx_ring[i]->reg_idx = ((i + 8) << 3);
-                               adapter->rx_ring[i]->reg_idx = i << 4;
-                       }
-                       ret = true;
-               } else if (dcb_i == 4) {
-                       /*
-                        * Tx TC0 starts at: descriptor queue 0
-                        * Tx TC1 starts at: descriptor queue 64
-                        * Tx TC2 starts at: descriptor queue 96
-                        * Tx TC3 starts at: descriptor queue 112
-                        *
-                        * Rx TC0-TC3 are offset by 32 queues each
-                        */
-                       adapter->tx_ring[0]->reg_idx = 0;
-                       adapter->tx_ring[1]->reg_idx = 64;
-                       adapter->tx_ring[2]->reg_idx = 96;
-                       adapter->tx_ring[3]->reg_idx = 112;
-                       for (i = 0 ; i < dcb_i; i++)
-                               adapter->rx_ring[i]->reg_idx = i << 5;
-                       ret = true;
+       for (i = 0, k = 0; i < num_tcs; i++) {
+               unsigned int tx_s, rx_s;
+               u16 count = dev->tc_to_txq[i].count;
+
+               ixgbe_get_first_reg_idx(adapter, i, &tx_s, &rx_s);
+               for (j = 0; j < count; j++, k++) {
+                       adapter->tx_ring[k]->reg_idx = tx_s + j;
+                       adapter->rx_ring[k]->reg_idx = rx_s + j;
+                       adapter->tx_ring[k]->dcb_tc = i;
+                       adapter->rx_ring[k]->dcb_tc = i;
                }
-               break;
-       default:
-               break;
        }
-       return ret;
+
+       return true;
 }
 #endif
 
@@ -4619,33 +4695,6 @@ static inline bool ixgbe_cache_ring_fcoe(struct ixgbe_adapter *adapter)
        if (!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))
                return false;
 
-#ifdef CONFIG_IXGBE_DCB
-       if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
-               struct ixgbe_fcoe *fcoe = &adapter->fcoe;
-
-               ixgbe_cache_ring_dcb(adapter);
-               /* find out queues in TC for FCoE */
-               fcoe_rx_i = adapter->rx_ring[fcoe->tc]->reg_idx + 1;
-               fcoe_tx_i = adapter->tx_ring[fcoe->tc]->reg_idx + 1;
-               /*
-                * In 82599, the number of Tx queues for each traffic
-                * class for both 8-TC and 4-TC modes are:
-                * TCs  : TC0 TC1 TC2 TC3 TC4 TC5 TC6 TC7
-                * 8 TCs:  32  32  16  16   8   8   8   8
-                * 4 TCs:  64  64  32  32
-                * We have max 8 queues for FCoE, where 8 the is
-                * FCoE redirection table size. If TC for FCoE is
-                * less than or equal to TC3, we have enough queues
-                * to add max of 8 queues for FCoE, so we start FCoE
-                * Tx queue from the next one, i.e., reg_idx + 1.
-                * If TC for FCoE is above TC3, implying 8 TC mode,
-                * and we need 8 for FCoE, we have to take all queues
-                * in that traffic class for FCoE.
-                */
-               if ((f->indices == IXGBE_FCRETA_SIZE) && (fcoe->tc > 3))
-                       fcoe_tx_i--;
-       }
-#endif /* CONFIG_IXGBE_DCB */
        if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) {
                if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ||
                    (adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE))
@@ -4702,16 +4751,16 @@ static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
        if (ixgbe_cache_ring_sriov(adapter))
                return;
 
+#ifdef CONFIG_IXGBE_DCB
+       if (ixgbe_cache_ring_dcb(adapter))
+               return;
+#endif
+
 #ifdef IXGBE_FCOE
        if (ixgbe_cache_ring_fcoe(adapter))
                return;
-
 #endif /* IXGBE_FCOE */
-#ifdef CONFIG_IXGBE_DCB
-       if (ixgbe_cache_ring_dcb(adapter))
-               return;
 
-#endif
        if (ixgbe_cache_ring_fdir(adapter))
                return;
 
@@ -5173,10 +5222,10 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
        adapter->dcb_cfg.bw_percentage[DCB_RX_CONFIG][0] = 100;
        adapter->dcb_cfg.rx_pba_cfg = pba_equal;
        adapter->dcb_cfg.pfc_mode_enable = false;
-       adapter->dcb_cfg.round_robin_enable = false;
        adapter->dcb_set_bitmap = 0x00;
+       adapter->dcbx_cap = DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_CEE;
        ixgbe_copy_dcb_cfg(&adapter->dcb_cfg, &adapter->temp_dcb_cfg,
-                          adapter->ring_feature[RING_F_DCB].indices);
+                          MAX_TRAFFIC_CLASS);
 
 #endif
 
@@ -5441,8 +5490,14 @@ static int ixgbe_change_mtu(struct net_device *netdev, int new_mtu)
        int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
 
        /* MTU < 68 is an error and causes problems on some kernels */
-       if ((new_mtu < 68) || (max_frame > IXGBE_MAX_JUMBO_FRAME_SIZE))
-               return -EINVAL;
+       if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED &&
+           hw->mac.type != ixgbe_mac_X540) {
+               if ((new_mtu < 68) || (max_frame > MAXIMUM_ETHERNET_VLAN_SIZE))
+                       return -EINVAL;
+       } else {
+               if ((new_mtu < 68) || (max_frame > IXGBE_MAX_JUMBO_FRAME_SIZE))
+                       return -EINVAL;
+       }
 
        e_info(probe, "changing MTU from %d to %d\n", netdev->mtu, new_mtu);
        /* must set new MTU before calling down or up */
@@ -5610,6 +5665,10 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)
        }
 
        ixgbe_clear_interrupt_scheme(adapter);
+#ifdef CONFIG_DCB
+       kfree(adapter->ixgbe_ieee_pfc);
+       kfree(adapter->ixgbe_ieee_ets);
+#endif
 
 #ifdef CONFIG_PM
        retval = pci_save_state(pdev);
@@ -5968,7 +6027,8 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work)
                unregister_netdev(adapter->netdev);
                return;
        }
-       hw->mac.ops.setup_sfp(hw);
+       if (hw->mac.ops.setup_sfp)
+               hw->mac.ops.setup_sfp(hw);
 
        if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
                /* This will also work for DA Twinax connections */
@@ -6099,7 +6159,10 @@ static void ixgbe_watchdog_task(struct work_struct *work)
                               (link_speed == IXGBE_LINK_SPEED_10GB_FULL ?
                               "10 Gbps" :
                               (link_speed == IXGBE_LINK_SPEED_1GB_FULL ?
-                              "1 Gbps" : "unknown speed")),
+                              "1 Gbps" :
+                              (link_speed == IXGBE_LINK_SPEED_100_FULL ?
+                              "100 Mbps" :
+                              "unknown speed"))),
                               ((flow_rx && flow_tx) ? "RX/TX" :
                               (flow_rx ? "RX" :
                               (flow_tx ? "TX" : "None"))));
@@ -6634,18 +6697,12 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)
 
        protocol = vlan_get_protocol(skb);
 
-       if ((protocol == htons(ETH_P_FCOE)) ||
-           (protocol == htons(ETH_P_FIP))) {
-               if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) {
-                       txq &= (adapter->ring_feature[RING_F_FCOE].indices - 1);
-                       txq += adapter->ring_feature[RING_F_FCOE].mask;
-                       return txq;
-#ifdef CONFIG_IXGBE_DCB
-               } else if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
-                       txq = adapter->fcoe.up;
-                       return txq;
-#endif
-               }
+       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;
+               return txq;
        }
 #endif
 
@@ -6655,15 +6712,6 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)
                return txq;
        }
 
-       if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
-               if (skb->priority == TC_PRIO_CONTROL)
-                       txq = adapter->ring_feature[RING_F_DCB].indices-1;
-               else
-                       txq = (skb->vlan_tci & IXGBE_TX_FLAGS_VLAN_PRIO_MASK)
-                              >> 13;
-               return txq;
-       }
-
        return skb_tx_hash(dev, skb);
 }
 
@@ -6685,13 +6733,13 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
                tx_flags |= vlan_tx_tag_get(skb);
                if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
                        tx_flags &= ~IXGBE_TX_FLAGS_VLAN_PRIO_MASK;
-                       tx_flags |= ((skb->queue_mapping & 0x7) << 13);
+                       tx_flags |= tx_ring->dcb_tc << 13;
                }
                tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
                tx_flags |= IXGBE_TX_FLAGS_VLAN;
        } else if (adapter->flags & IXGBE_FLAG_DCB_ENABLED &&
                   skb->priority != TC_PRIO_CONTROL) {
-               tx_flags |= ((skb->queue_mapping & 0x7) << 13);
+               tx_flags |= tx_ring->dcb_tc << 13;
                tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
                tx_flags |= IXGBE_TX_FLAGS_VLAN;
        }
@@ -6700,20 +6748,8 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
        /* for FCoE with DCB, we force the priority to what
         * was specified by the switch */
        if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED &&
-           (protocol == htons(ETH_P_FCOE) ||
-            protocol == htons(ETH_P_FIP))) {
-#ifdef CONFIG_IXGBE_DCB
-               if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
-                       tx_flags &= ~(IXGBE_TX_FLAGS_VLAN_PRIO_MASK
-                                     << IXGBE_TX_FLAGS_VLAN_SHIFT);
-                       tx_flags |= ((adapter->fcoe.up << 13)
-                                     << IXGBE_TX_FLAGS_VLAN_SHIFT);
-               }
-#endif
-               /* flag for FCoE offloads */
-               if (protocol == htons(ETH_P_FCOE))
-                       tx_flags |= IXGBE_TX_FLAGS_FCOE;
-       }
+           (protocol == htons(ETH_P_FCOE)))
+               tx_flags |= IXGBE_TX_FLAGS_FCOE;
 #endif
 
        /* four things can cause us to need a context descriptor */
@@ -6991,6 +7027,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
 #endif
 #ifdef IXGBE_FCOE
        .ndo_fcoe_ddp_setup = ixgbe_fcoe_ddp_get,
+       .ndo_fcoe_ddp_target = ixgbe_fcoe_ddp_target,
        .ndo_fcoe_ddp_done = ixgbe_fcoe_ddp_put,
        .ndo_fcoe_enable = ixgbe_fcoe_enable,
        .ndo_fcoe_disable = ixgbe_fcoe_disable,
@@ -7126,8 +7163,9 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
        else
                indices = min_t(unsigned int, indices, IXGBE_MAX_FDIR_INDICES);
 
+#if defined(CONFIG_DCB)
        indices = max_t(unsigned int, indices, IXGBE_MAX_DCB_INDICES);
-#ifdef IXGBE_FCOE
+#elif defined(IXGBE_FCOE)
        indices += min_t(unsigned int, num_possible_cpus(),
                         IXGBE_MAX_FCOE_INDICES);
 #endif
@@ -7704,16 +7742,6 @@ static int ixgbe_notify_dca(struct notifier_block *nb, unsigned long event,
 
 #endif /* CONFIG_IXGBE_DCA */
 
-/**
- * ixgbe_get_hw_dev return device
- * used by hardware layer to print debugging information
- **/
-struct net_device *ixgbe_get_hw_dev(struct ixgbe_hw *hw)
-{
-       struct ixgbe_adapter *adapter = hw->back;
-       return adapter->netdev;
-}
-
 module_exit(ixgbe_exit_module);
 
 /* ixgbe_main.c */