#define I40EVF_GLOBAL_STATS_LEN ARRAY_SIZE(i40evf_gstrings_stats)
 #define I40EVF_QUEUE_STATS_LEN(_dev) \
        (((struct i40evf_adapter *) \
-               netdev_priv(_dev))->vsi_res->num_queue_pairs \
+               netdev_priv(_dev))->num_active_queues \
                  * 2 * (sizeof(struct i40e_queue_stats) / sizeof(u64)))
 #define I40EVF_STATS_LEN(_dev) \
        (I40EVF_GLOBAL_STATS_LEN + I40EVF_QUEUE_STATS_LEN(_dev))
                p = (char *)adapter + i40evf_gstrings_stats[i].stat_offset;
                data[i] =  *(u64 *)p;
        }
-       for (j = 0; j < adapter->vsi_res->num_queue_pairs; j++) {
+       for (j = 0; j < adapter->num_active_queues; j++) {
                data[i++] = adapter->tx_rings[j]->stats.packets;
                data[i++] = adapter->tx_rings[j]->stats.bytes;
        }
-       for (j = 0; j < adapter->vsi_res->num_queue_pairs; j++) {
+       for (j = 0; j < adapter->num_active_queues; j++) {
                data[i++] = adapter->rx_rings[j]->stats.packets;
                data[i++] = adapter->rx_rings[j]->stats.bytes;
        }
                               ETH_GSTRING_LEN);
                        p += ETH_GSTRING_LEN;
                }
-               for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
+               for (i = 0; i < adapter->num_active_queues; i++) {
                        snprintf(p, ETH_GSTRING_LEN, "tx-%u.packets", i);
                        p += ETH_GSTRING_LEN;
                        snprintf(p, ETH_GSTRING_LEN, "tx-%u.bytes", i);
                        p += ETH_GSTRING_LEN;
                }
-               for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
+               for (i = 0; i < adapter->num_active_queues; i++) {
                        snprintf(p, ETH_GSTRING_LEN, "rx-%u.packets", i);
                        p += ETH_GSTRING_LEN;
                        snprintf(p, ETH_GSTRING_LEN, "rx-%u.bytes", i);
 
        switch (cmd->cmd) {
        case ETHTOOL_GRXRINGS:
-               cmd->data = adapter->vsi_res->num_queue_pairs;
+               cmd->data = adapter->num_active_queues;
                ret = 0;
                break;
        case ETHTOOL_GRXFH:
        struct i40evf_adapter *adapter = netdev_priv(netdev);
 
        /* Report maximum channels */
-       ch->max_combined = adapter->vsi_res->num_queue_pairs;
+       ch->max_combined = adapter->num_active_queues;
 
        ch->max_other = NONQ_VECS;
        ch->other_count = NONQ_VECS;
 
-       ch->combined_count = adapter->vsi_res->num_queue_pairs;
+       ch->combined_count = adapter->num_active_queues;
 }
 
 /**
 
        int q_vectors;
        int v_start = 0;
        int rxr_idx = 0, txr_idx = 0;
-       int rxr_remaining = adapter->vsi_res->num_queue_pairs;
-       int txr_remaining = adapter->vsi_res->num_queue_pairs;
+       int rxr_remaining = adapter->num_active_queues;
+       int txr_remaining = adapter->num_active_queues;
        int i, j;
        int rqpv, tqpv;
        int err = 0;
 {
        struct i40e_hw *hw = &adapter->hw;
        int i;
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++)
+       for (i = 0; i < adapter->num_active_queues; i++)
                adapter->tx_rings[i]->tail = hw->hw_addr + I40E_QTX_TAIL1(i);
 }
 
                        rx_buf_len = ALIGN(max_frame, 1024);
        }
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
+       for (i = 0; i < adapter->num_active_queues; i++) {
                adapter->rx_rings[i]->tail = hw->hw_addr + I40E_QRX_TAIL1(i);
                adapter->rx_rings[i]->rx_buf_len = rx_buf_len;
        }
        i40evf_configure_rx(adapter);
        adapter->aq_required |= I40EVF_FLAG_AQ_CONFIGURE_QUEUES;
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
+       for (i = 0; i < adapter->num_active_queues; i++) {
                struct i40e_ring *ring = adapter->rx_rings[i];
                i40evf_alloc_rx_buffers(ring, ring->count);
                ring->next_to_use = ring->count - 1;
 {
        int i;
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++)
+       for (i = 0; i < adapter->num_active_queues; i++)
                i40evf_clean_rx_ring(adapter->rx_rings[i]);
 }
 
 {
        int i;
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++)
+       for (i = 0; i < adapter->num_active_queues; i++)
                i40evf_clean_tx_ring(adapter->tx_rings[i]);
 }
 
 
        if (!adapter->vsi_res)
                return;
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
+       for (i = 0; i < adapter->num_active_queues; i++) {
                if (adapter->tx_rings[i])
                        kfree_rcu(adapter->tx_rings[i], rcu);
                adapter->tx_rings[i] = NULL;
 {
        int i;
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
+       for (i = 0; i < adapter->num_active_queues; i++) {
                struct i40e_ring *tx_ring;
                struct i40e_ring *rx_ring;
 
                err = -EIO;
                goto out;
        }
-       pairs = adapter->vsi_res->num_queue_pairs;
+       pairs = adapter->num_active_queues;
 
        /* It's easy to be greedy for MSI-X vectors, but it really
         * doesn't do us much good if we have a lot more vectors
        int napi_vectors;
 
        num_q_vectors = adapter->num_msix_vectors - NONQ_VECS;
-       napi_vectors = adapter->vsi_res->num_queue_pairs;
+       napi_vectors = adapter->num_active_queues;
 
        for (q_idx = 0; q_idx < num_q_vectors; q_idx++) {
                struct i40e_q_vector *q_vector = adapter->q_vector[q_idx];
        }
 
        dev_info(&adapter->pdev->dev, "Multiqueue %s: Queue pair count = %u",
-               (adapter->vsi_res->num_queue_pairs > 1) ? "Enabled" :
-               "Disabled", adapter->vsi_res->num_queue_pairs);
+               (adapter->num_active_queues > 1) ? "Enabled" :
+               "Disabled", adapter->num_active_queues);
 
        return 0;
 err_alloc_queues:
 {
        j += 1;
 
-       return j >= adapter->vsi_res->num_queue_pairs ? 0 : j;
+       return j >= adapter->num_active_queues ? 0 : j;
 }
 
 /**
                        0xc135cafa, 0x7a6f7e2d, 0xe7102d28, 0x163cd12e,
                        0x4954b126 };
 
-       /* Hash type is configured by the PF - we just supply the key */
+       /* No RSS for single queue. */
+       if (adapter->num_active_queues == 1) {
+               wr32(hw, I40E_VFQF_HENA(0), 0);
+               wr32(hw, I40E_VFQF_HENA(1), 0);
+               return;
+       }
 
-       /* Fill out hash function seed */
+       /* Hash type is configured by the PF - we just supply the key */
        for (i = 0; i <= I40E_VFQF_HKEY_MAX_INDEX; i++)
                wr32(hw, I40E_VFQF_HKEY(i), seed[i]);
 
        wr32(hw, I40E_VFQF_HENA(1), (u32)(hena >> 32));
 
        /* Populate the LUT with max no. of queues in round robin fashion */
-       j = adapter->vsi_res->num_queue_pairs;
+       j = adapter->num_active_queues;
        for (i = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++) {
                j = next_queue(adapter, j);
                lut = j;
 {
        int i;
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++)
+       for (i = 0; i < adapter->num_active_queues; i++)
                if (adapter->tx_rings[i]->desc)
                        i40evf_free_tx_resources(adapter->tx_rings[i]);
 
 {
        int i, err = 0;
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
+       for (i = 0; i < adapter->num_active_queues; i++) {
                adapter->tx_rings[i]->count = adapter->tx_desc_count;
                err = i40evf_setup_tx_descriptors(adapter->tx_rings[i]);
                if (!err)
 {
        int i, err = 0;
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) {
+       for (i = 0; i < adapter->num_active_queues; i++) {
                adapter->rx_rings[i]->count = adapter->rx_desc_count;
                err = i40evf_setup_rx_descriptors(adapter->rx_rings[i]);
                if (!err)
 {
        int i;
 
-       for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++)
+       for (i = 0; i < adapter->num_active_queues; i++)
                if (adapter->rx_rings[i]->desc)
                        i40evf_free_rx_resources(adapter->rx_rings[i]);
 }
        adapter->watchdog_timer.data = (unsigned long)adapter;
        mod_timer(&adapter->watchdog_timer, jiffies + 1);
 
+       adapter->num_active_queues = min_t(int,
+                                          adapter->vsi_res->num_queue_pairs,
+                                          (int)(num_online_cpus()));
        adapter->tx_desc_count = I40EVF_DEFAULT_TXD;
        adapter->rx_desc_count = I40EVF_DEFAULT_RXD;
        err = i40evf_init_interrupt_scheme(adapter);