adapter->ring_feature[RING_F_RSS].indices = 1;
        adapter->ring_feature[RING_F_RSS].mask = IXGBE_RSS_DISABLED_MASK;
 
+       /* disable ATR as it is not supported when VMDq is enabled */
+       adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
+
        adapter->num_rx_pools = vmdq_i;
        adapter->num_rx_queues_per_pool = tcs;
 
        f->indices = rss_i;
        f->mask = rss_m;
 
+       /* disable ATR as it is not supported when multiple TCs are enabled */
+       adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
+
 #ifdef IXGBE_FCOE
        /* FCoE enabled queues require special configuration indexed
         * by feature specific indices and offset. Here we map FCoE
        f->indices = rss_i;
        f->mask = IXGBE_RSS_16Q_MASK;
 
+       /* disable ATR by default, it will be configured below */
+       adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
+
        /*
         * Use Flow Director in addition to RSS to ensure the best
         * distribution of flows across cores, even when an FDIR flow
         * isn't matched.
         */
-       if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) {
+       if (rss_i > 1 && adapter->atr_sample_rate) {
                f = &adapter->ring_feature[RING_F_FDIR];
 
                f->indices = min_t(u16, num_online_cpus(), f->limit);
                rss_i = max_t(u16, rss_i, f->indices);
+
+               if (!(adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE))
+                       adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
        }
 
 #ifdef IXGBE_FCOE
        }
 
        adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
-       if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) {
-               e_err(probe,
-                     "ATR is not supported while multiple "
-                     "queues are disabled.  Disabling Flow Director\n");
-       }
-       adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
-       adapter->atr_sample_rate = 0;
+
        ixgbe_disable_sriov(adapter);
 
        adapter->ring_feature[RING_F_RSS].limit = 1;
 
                   32;          /* PTHRESH = 32 */
 
        /* reinitialize flowdirector state */
-       if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) &&
-           adapter->atr_sample_rate) {
+       if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) {
                ring->atr_sample_rate = adapter->atr_sample_rate;
                ring->atr_count = 0;
                set_bit(__IXGBE_TX_FDIR_INIT_DONE, &ring->state);
                if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM)
                        adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE;
                /* Flow Director hash filters enabled */
-               adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
                adapter->atr_sample_rate = 20;
                adapter->ring_feature[RING_F_FDIR].limit =
                                                         IXGBE_MAX_FDIR_INDICES;
                ixgbe_set_prio_tc_map(adapter);
 
                adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
-               adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
 
                if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
                        adapter->last_lfc_mode = adapter->hw.fc.requested_mode;
                        adapter->hw.fc.requested_mode = adapter->last_lfc_mode;
 
                adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
-               adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
 
                adapter->temp_dcb_cfg.pfc_mode_enable = false;
                adapter->dcb_cfg.pfc_mode_enable = false;
         * Check if Flow Director n-tuple support was enabled or disabled.  If
         * the state changed, we need to reset.
         */
-       if (!(features & NETIF_F_NTUPLE)) {
-               if (adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) {
-                       /* turn off Flow Director, set ATR and reset */
-                       if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) &&
-                           !(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
-                               adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
-                       need_reset = true;
-               }
-               adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
-       } else if (!(adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)) {
+       switch (features & NETIF_F_NTUPLE) {
+       case NETIF_F_NTUPLE:
                /* turn off ATR, enable perfect filters and reset */
+               if (!(adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE))
+                       need_reset = true;
+
                adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
                adapter->flags |= IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
-               need_reset = true;
+               break;
+       default:
+               /* turn off perfect filters, enable ATR and reset */
+               if (adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)
+                       need_reset = true;
+
+               adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
+
+               /* We cannot enable ATR if SR-IOV is enabled */
+               if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
+                       break;
+
+               /* We cannot enable ATR if we have 2 or more traffic classes */
+               if (netdev_get_num_tc(netdev) > 1)
+                       break;
+
+               /* We cannot enable ATR if RSS is disabled */
+               if (adapter->ring_feature[RING_F_RSS].limit <= 1)
+                       break;
+
+               /* A sample rate of 0 indicates ATR disabled */
+               if (!adapter->atr_sample_rate)
+                       break;
+
+               adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
+               break;
        }
 
        if (features & NETIF_F_HW_VLAN_RX)