ice: Fix configuring VIRTCHNL_OP_CONFIG_VSI_QUEUES with unbalanced queues
authorMarcin Szycik <marcin.szycik@linux.intel.com>
Mon, 7 Nov 2022 16:10:38 +0000 (17:10 +0100)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Wed, 23 Nov 2022 16:59:43 +0000 (08:59 -0800)
Currently the VIRTCHNL_OP_CONFIG_VSI_QUEUES command may fail if there are
less RX queues than TX queues requested.

To fix it, only configure RXDID if RX queue exists.

Fixes: e753df8fbca5 ("ice: Add support Flex RXD")
Signed-off-by: Marcin Szycik <marcin.szycik@linux.intel.com>
Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_virtchnl.c

index ec90e59..dab3cd5 100644 (file)
@@ -1621,9 +1621,6 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
        }
 
        for (i = 0; i < qci->num_queue_pairs; i++) {
-               struct ice_hw *hw;
-               u32 rxdid;
-               u16 pf_q;
                qpi = &qci->qpair[i];
                if (qpi->txq.vsi_id != qci->vsi_id ||
                    qpi->rxq.vsi_id != qci->vsi_id ||
@@ -1664,6 +1661,7 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
                /* 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);
+                       u32 rxdid;
 
                        vsi->rx_rings[i]->dma = qpi->rxq.dma_ring_addr;
                        vsi->rx_rings[i]->count = qpi->rxq.ring_len;
@@ -1691,26 +1689,25 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
                                         vf->vf_id, i);
                                goto error_param;
                        }
-               }
 
-               /* VF Rx queue RXDID configuration */
-               pf_q = vsi->rxq_map[qpi->rxq.queue_id];
-               rxdid = qpi->rxq.rxdid;
-               hw = &vsi->back->hw;
+                       /* If Rx flex desc is supported, select RXDID for Rx
+                        * queues. Otherwise, use legacy 32byte descriptor
+                        * format. Legacy 16byte descriptor is not supported.
+                        * If this RXDID is selected, return error.
+                        */
+                       if (vf->driver_caps &
+                           VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC) {
+                               rxdid = qpi->rxq.rxdid;
+                               if (!(BIT(rxdid) & pf->supported_rxdids))
+                                       goto error_param;
+                       } else {
+                               rxdid = ICE_RXDID_LEGACY_1;
+                       }
 
-               /* If Rx flex desc is supported, select RXDID for Rx queues.
-                * Otherwise, use legacy 32byte descriptor format.
-                * Legacy 16byte descriptor is not supported. If this RXDID
-                * is selected, return error.
-                */
-               if (vf->driver_caps & VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC) {
-                       if (!(BIT(rxdid) & pf->supported_rxdids))
-                               goto error_param;
-               } else {
-                       rxdid = ICE_RXDID_LEGACY_1;
+                       ice_write_qrxflxp_cntxt(&vsi->back->hw,
+                                               vsi->rxq_map[q_idx],
+                                               rxdid, 0x03, false);
                }
-
-               ice_write_qrxflxp_cntxt(hw, pf_q, rxdid, 0x03, false);
        }
 
        /* send the response to the VF */