Commit c7cb9dfc authored by Marcin Szycik's avatar Marcin Szycik Committed by Tony Nguyen
Browse files

ice: Fix configuring VIRTCHNL_OP_CONFIG_VSI_QUEUES with unbalanced queues



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: e753df8f ("ice: Add support Flex RXD")
Signed-off-by: default avatarMarcin Szycik <marcin.szycik@linux.intel.com>
Tested-by: default avatarKonrad Jankowski <konrad0.jankowski@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 288ecf49
Loading
Loading
Loading
Loading
+17 −20
Original line number Diff line number Diff line
@@ -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 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 (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;
			}

		ice_write_qrxflxp_cntxt(hw, pf_q, rxdid, 0x03, false);
			ice_write_qrxflxp_cntxt(&vsi->back->hw,
						vsi->rxq_map[q_idx],
						rxdid, 0x03, false);
		}
	}

	/* send the response to the VF */