enum ixgbe_ring_state_t {
        __IXGBE_TX_FDIR_INIT_DONE,
+       __IXGBE_TX_XPS_INIT_DONE,
        __IXGBE_TX_DETECT_HANG,
        __IXGBE_HANG_CHECK_ARMED,
        __IXGBE_RX_RSC_ENABLED,
 
 {
        struct ixgbe_q_vector *q_vector;
        struct ixgbe_ring *ring;
-       int node = -1;
+       int node = NUMA_NO_NODE;
        int cpu = -1;
        int ring_count, size;
+       u8 tcs = netdev_get_num_tc(adapter->netdev);
 
        ring_count = txr_count + rxr_count;
        size = sizeof(struct ixgbe_q_vector) +
               (sizeof(struct ixgbe_ring) * ring_count);
 
        /* customize cpu for Flow Director mapping */
-       if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) {
-               if (cpu_online(v_idx)) {
-                       cpu = v_idx;
-                       node = cpu_to_node(cpu);
+       if ((tcs <= 1) && !(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) {
+               u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
+               if (rss_i > 1 && adapter->atr_sample_rate) {
+                       if (cpu_online(v_idx)) {
+                               cpu = v_idx;
+                               node = cpu_to_node(cpu);
+                       }
                }
        }
 
 
                ring->atr_sample_rate = 0;
        }
 
+       /* initialize XPS */
+       if (!test_and_set_bit(__IXGBE_TX_XPS_INIT_DONE, &ring->state)) {
+               struct ixgbe_q_vector *q_vector = ring->q_vector;
+
+               if (q_vector)
+                       netif_set_xps_queue(adapter->netdev,
+                                           &q_vector->affinity_mask,
+                                           ring->queue_index);
+       }
+
        clear_bit(__IXGBE_HANG_CHECK_ARMED, &ring->state);
 
        /* enable queue */