struct ieee_ets *ixgbe_ieee_ets;
        struct ixgbe_dcb_config dcb_cfg;
        struct ixgbe_dcb_config temp_dcb_cfg;
+       u8 hw_tcs;
        u8 dcb_set_bitmap;
        u8 dcbx_cap;
        enum ixgbe_fc_mode last_lfc_mode;
 
        if (max_tc > adapter->dcb_cfg.num_tcs.pg_tcs)
                return -EINVAL;
 
-       if (max_tc != netdev_get_num_tc(dev)) {
+       if (max_tc != adapter->hw_tcs) {
                err = ixgbe_setup_tc(dev, max_tc);
                if (err)
                        return err;
 
 static unsigned int ixgbe_max_channels(struct ixgbe_adapter *adapter)
 {
        unsigned int max_combined;
-       u8 tcs = netdev_get_num_tc(adapter->netdev);
+       u8 tcs = adapter->hw_tcs;
 
        if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
                /* We only support one q_vector without MSI-X */
                return;
 
        /* same thing goes for being DCB enabled */
-       if (netdev_get_num_tc(dev) > 1)
+       if (adapter->hw_tcs > 1)
                return;
 
        /* if ATR is disabled we can exit */
 
 #endif
        /* use setup TC to update any traffic class queue mapping */
-       return ixgbe_setup_tc(dev, netdev_get_num_tc(dev));
+       return ixgbe_setup_tc(dev, adapter->hw_tcs);
 }
 
 static int ixgbe_get_module_info(struct net_device *dev,
 
        struct ixgbe_ring_feature *vmdq = &adapter->ring_feature[RING_F_VMDQ];
        int i;
        u16 reg_idx;
-       u8 tcs = netdev_get_num_tc(adapter->netdev);
+       u8 tcs = adapter->hw_tcs;
 
        /* verify we have DCB queueing enabled before proceeding */
        if (tcs <= 1)
 static 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);
+       u8 num_tcs = adapter->hw_tcs;
 
        *tx = 0;
        *rx = 0;
  **/
 static bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter)
 {
-       struct net_device *dev = adapter->netdev;
+       u8 num_tcs = adapter->hw_tcs;
        unsigned int tx_idx, rx_idx;
        int tc, offset, rss_i, i;
-       u8 num_tcs = netdev_get_num_tc(dev);
 
        /* verify we have DCB queueing enabled before proceeding */
        if (num_tcs <= 1)
 #ifdef IXGBE_FCOE
        u16 fcoe_i = 0;
 #endif
-       u8 tcs = netdev_get_num_tc(adapter->netdev);
+       u8 tcs = adapter->hw_tcs;
 
        /* verify we have DCB queueing enabled before proceeding */
        if (tcs <= 1)
        int tcs;
 
        /* Map queue offset and counts onto allocated tx queues */
-       tcs = netdev_get_num_tc(dev);
+       tcs = adapter->hw_tcs;
 
        /* verify we have DCB queueing enabled before proceeding */
        if (tcs <= 1)
        int node = NUMA_NO_NODE;
        int cpu = -1;
        int ring_count, size;
-       u8 tcs = netdev_get_num_tc(adapter->netdev);
+       u8 tcs = adapter->hw_tcs;
 
        ring_count = txr_count + rxr_count + xdp_count;
        size = sizeof(struct ixgbe_q_vector) +
         */
 
        /* Disable DCB unless we only have a single traffic class */
-       if (netdev_get_num_tc(adapter->netdev) > 1) {
+       if (adapter->hw_tcs > 1) {
                e_dev_warn("Number of DCB TCs exceeds number of available queues. Disabling DCB support.\n");
                netdev_reset_tc(adapter->netdev);
 
                adapter->dcb_cfg.pfc_mode_enable = false;
        }
 
+       adapter->hw_tcs = 0;
        adapter->dcb_cfg.num_tcs.pg_tcs = 1;
        adapter->dcb_cfg.num_tcs.pfc_tcs = 1;
 
 
 {
        struct ixgbe_hw *hw = &adapter->hw;
        u32 rttdcs, mtqc;
-       u8 tcs = netdev_get_num_tc(adapter->netdev);
+       u8 tcs = adapter->hw_tcs;
 
        if (hw->mac.type == ixgbe_mac_82598EB)
                return;
                if (adapter->ring_feature[RING_F_RSS].mask)
                        mrqc = IXGBE_MRQC_RSSEN;
        } else {
-               u8 tcs = netdev_get_num_tc(adapter->netdev);
+               u8 tcs = adapter->hw_tcs;
 
                if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
                        if (tcs > 4)
 static void ixgbe_pbthresh_setup(struct ixgbe_adapter *adapter)
 {
        struct ixgbe_hw *hw = &adapter->hw;
-       int num_tc = netdev_get_num_tc(adapter->netdev);
+       int num_tc = adapter->hw_tcs;
        int i;
 
        if (!num_tc)
 {
        struct ixgbe_hw *hw = &adapter->hw;
        int hdrm;
-       u8 tc = netdev_get_num_tc(adapter->netdev);
+       u8 tc = adapter->hw_tcs;
 
        if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE ||
            adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)
                netdev_set_num_tc(dev, tc);
                ixgbe_set_prio_tc_map(adapter);
 
+               adapter->hw_tcs = tc;
                adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
 
                if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
                        adapter->hw.fc.requested_mode = adapter->last_lfc_mode;
 
                adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
+               adapter->hw_tcs = tc;
 
                adapter->temp_dcb_cfg.pfc_mode_enable = false;
                adapter->dcb_cfg.pfc_mode_enable = false;
        struct net_device *netdev = adapter->netdev;
 
        rtnl_lock();
-       ixgbe_setup_tc(netdev, netdev_get_num_tc(netdev));
+       ixgbe_setup_tc(netdev, adapter->hw_tcs);
        rtnl_unlock();
 }
 
                /* We cannot enable ATR if SR-IOV is enabled */
                if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED ||
                    /* We cannot enable ATR if we have 2 or more tcs */
-                   (netdev_get_num_tc(netdev) > 1) ||
+                   (adapter->hw_tcs > 1) ||
                    /* We cannot enable ATR if RSS is disabled */
                    (adapter->ring_feature[RING_F_RSS].limit <= 1) ||
                    /* A sample rate of 0 indicates ATR disabled */
        struct ixgbe_fwd_adapter *fwd_adapter = NULL;
        struct ixgbe_adapter *adapter = netdev_priv(pdev);
        int used_pools = adapter->num_vfs + adapter->num_rx_pools;
-       int tcs = netdev_get_num_tc(pdev) ? : 1;
+       int tcs = adapter->hw_tcs ? : 1;
        unsigned int limit;
        int pool, err;
 
        adapter->ring_feature[RING_F_RSS].limit = vdev->num_tx_queues;
 
        /* Force reinit of ring allocation with VMDQ enabled */
-       err = ixgbe_setup_tc(pdev, netdev_get_num_tc(pdev));
+       err = ixgbe_setup_tc(pdev, adapter->hw_tcs);
        if (err)
                goto fwd_add_err;
        fwd_adapter->pool = pool;
                adapter->ring_feature[RING_F_RSS].limit = rss;
        }
 
-       ixgbe_setup_tc(pdev, netdev_get_num_tc(pdev));
+       ixgbe_setup_tc(pdev, adapter->hw_tcs);
        netdev_dbg(pdev, "pool %i:%i queues %i:%i\n",
                   fwd_adapter->pool, adapter->num_rx_pools,
                   fwd_adapter->rx_base_queue,
 
        /* If transitioning XDP modes reconfigure rings */
        if (!!prog != !!old_prog) {
-               int err = ixgbe_setup_tc(dev, netdev_get_num_tc(dev));
+               int err = ixgbe_setup_tc(dev, adapter->hw_tcs);
 
                if (err) {
                        rcu_assign_pointer(adapter->xdp_prog, old_prog);
 
         * than we have available pools. The PCI bus driver already checks for
         * other values out of range.
         */
-       num_tc = netdev_get_num_tc(adapter->netdev);
+       num_tc = adapter->hw_tcs;
        num_rx_pools = adapter->num_rx_pools;
        limit = (num_tc > 4) ? IXGBE_MAX_VFS_8TC :
                (num_tc > 1) ? IXGBE_MAX_VFS_4TC : IXGBE_MAX_VFS_1TC;
 {
        struct ixgbe_hw *hw = &adapter->hw;
        struct vf_data_storage *vfinfo = &adapter->vfinfo[vf];
-       u8 num_tcs = netdev_get_num_tc(adapter->netdev);
+       u8 num_tcs = adapter->hw_tcs;
 
        /* remove VLAN filters beloning to this VF */
        ixgbe_clear_vf_vlans(adapter, vf);
 {
        u32 add = (msgbuf[0] & IXGBE_VT_MSGINFO_MASK) >> IXGBE_VT_MSGINFO_SHIFT;
        u32 vid = (msgbuf[1] & IXGBE_VLVF_VLANID_MASK);
-       u8 tcs = netdev_get_num_tc(adapter->netdev);
+       u8 tcs = adapter->hw_tcs;
 
        if (adapter->vfinfo[vf].pf_vlan || tcs) {
                e_warn(drv,
        struct net_device *dev = adapter->netdev;
        struct ixgbe_ring_feature *vmdq = &adapter->ring_feature[RING_F_VMDQ];
        unsigned int default_tc = 0;
-       u8 num_tcs = netdev_get_num_tc(dev);
+       u8 num_tcs = adapter->hw_tcs;
 
        /* verify the PF is supporting the correct APIs */
        switch (adapter->vfinfo[vf].vf_api) {