if (!tc) {
                netdev_reset_tc(dev);
        } else {
-               if (netdev_set_num_tc(dev, tc))
+               struct ixgbe_adapter *adapter = netdev_priv(dev);
+
+               /* Hardware supports up to 8 traffic classes */
+               if (tc > MAX_TRAFFIC_CLASS || netdev_set_num_tc(dev, tc))
                        return -EINVAL;
 
                /* Partition Tx queues evenly amongst traffic classes */
                        netdev_set_tc_queue(dev, i, q, offset);
                        offset += q;
                }
+
+               /* This enables multiple traffic class support in the hardware
+                * which defaults to strict priority transmission by default.
+                * If traffic classes are already enabled perhaps through DCB
+                * code path then existing configuration will be used.
+                */
+               if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED) &&
+                   dev->dcbnl_ops && dev->dcbnl_ops->setdcbx) {
+                       struct ieee_ets ets = {
+                                       .prio_tc = {0, 1, 2, 3, 4, 5, 6, 7},
+                                             };
+                       u8 mode = DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_IEEE;
+
+                       dev->dcbnl_ops->setdcbx(dev, mode);
+                       dev->dcbnl_ops->ieee_setets(dev, &ets);
+               }
        }
        return 0;
 }
        .ndo_set_vf_tx_rate     = ixgbe_ndo_set_vf_bw,
        .ndo_get_vf_config      = ixgbe_ndo_get_vf_config,
        .ndo_get_stats64        = ixgbe_get_stats64,
+#ifdef CONFIG_IXGBE_DCB
+       .ndo_setup_tc           = ixgbe_setup_tc,
+#endif
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller    = ixgbe_netpoll,
 #endif