wr32(hw, QRXFLXP_CNTXT(pf_q), regval);
 }
 
+int ice_vsi_cfg_single_rxq(struct ice_vsi *vsi, u16 q_idx)
+{
+       if (q_idx >= vsi->num_rxq)
+               return -EINVAL;
+
+       return ice_vsi_cfg_rxq(vsi->rx_rings[q_idx]);
+}
+
+int ice_vsi_cfg_single_txq(struct ice_vsi *vsi, struct ice_ring **tx_rings, u16 q_idx)
+{
+       struct ice_aqc_add_tx_qgrp *qg_buf;
+       int err;
+
+       if (q_idx >= vsi->alloc_txq || !tx_rings || !tx_rings[q_idx])
+               return -EINVAL;
+
+       qg_buf = kzalloc(struct_size(qg_buf, txqs, 1), GFP_KERNEL);
+       if (!qg_buf)
+               return -ENOMEM;
+
+       qg_buf->num_txqs = 1;
+
+       err = ice_vsi_cfg_txq(vsi, tx_rings[q_idx], qg_buf);
+       kfree(qg_buf);
+       return err;
+}
+
 /**
  * ice_vsi_cfg_rxqs - Configure the VSI for Rx
  * @vsi: the VSI being configured
 
        struct virtchnl_vsi_queue_config_info *qci =
            (struct virtchnl_vsi_queue_config_info *)msg;
        struct virtchnl_queue_pair_info *qpi;
-       u16 num_rxq = 0, num_txq = 0;
        struct ice_pf *pf = vf->pf;
        struct ice_vsi *vsi;
-       int i;
+       int i, q_idx;
 
        if (!test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states)) {
                v_ret = VIRTCHNL_STATUS_ERR_PARAM;
                        v_ret = VIRTCHNL_STATUS_ERR_PARAM;
                        goto error_param;
                }
+
+               q_idx = qpi->rxq.queue_id;
+
+               /* make sure selected "q_idx" is in valid range of queues
+                * for selected "vsi"
+                */
+               if (q_idx >= vsi->alloc_txq || q_idx >= vsi->alloc_rxq) {
+                       v_ret = VIRTCHNL_STATUS_ERR_PARAM;
+                       goto error_param;
+               }
+
                /* copy Tx queue info from VF into VSI */
                if (qpi->txq.ring_len > 0) {
-                       num_txq++;
                        vsi->tx_rings[i]->dma = qpi->txq.dma_ring_addr;
                        vsi->tx_rings[i]->count = qpi->txq.ring_len;
+                       if (ice_vsi_cfg_single_txq(vsi, vsi->tx_rings, q_idx)) {
+                               v_ret = VIRTCHNL_STATUS_ERR_PARAM;
+                               goto error_param;
+                       }
                }
 
                /* copy Rx queue info from VF into VSI */
                if (qpi->rxq.ring_len > 0) {
                        u16 max_frame_size = ice_vc_get_max_frame_size(vf);
 
-                       num_rxq++;
                        vsi->rx_rings[i]->dma = qpi->rxq.dma_ring_addr;
                        vsi->rx_rings[i]->count = qpi->rxq.ring_len;
 
                                v_ret = VIRTCHNL_STATUS_ERR_PARAM;
                                goto error_param;
                        }
-               }
 
-               vsi->max_frame = qpi->rxq.max_pkt_size;
-               /* add space for the port VLAN since the VF driver is not
-                * expected to account for it in the MTU calculation
-                */
-               if (vf->port_vlan_info)
-                       vsi->max_frame += VLAN_HLEN;
-       }
-
-       /* VF can request to configure less than allocated queues or default
-        * allocated queues. So update the VSI with new number
-        */
-       vsi->num_txq = num_txq;
-       vsi->num_rxq = num_rxq;
-       /* All queues of VF VSI are in TC 0 */
-       vsi->tc_cfg.tc_info[0].qcount_tx = num_txq;
-       vsi->tc_cfg.tc_info[0].qcount_rx = num_rxq;
+                       vsi->max_frame = qpi->rxq.max_pkt_size;
+                       /* add space for the port VLAN since the VF driver is not
+                        * expected to account for it in the MTU calculation
+                        */
+                       if (vf->port_vlan_info)
+                               vsi->max_frame += VLAN_HLEN;
 
-       if (ice_vsi_cfg_lan_txqs(vsi) || ice_vsi_cfg_rxqs(vsi))
-               v_ret = VIRTCHNL_STATUS_ERR_ADMIN_QUEUE_ERROR;
+                       if (ice_vsi_cfg_single_rxq(vsi, q_idx)) {
+                               v_ret = VIRTCHNL_STATUS_ERR_PARAM;
+                               goto error_param;
+                       }
+               }
+       }
 
 error_param:
        /* send the response to the VF */