diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_lib.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_lib.c | 42 | 
1 files changed, 26 insertions, 16 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index 0c4ec9264071..58d483e2f539 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c @@ -914,7 +914,7 @@ static void ice_set_dflt_vsi_ctx(struct ice_hw *hw, struct ice_vsi_ctx *ctxt)   */  static int ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)  { -	u16 offset = 0, qmap = 0, tx_count = 0, pow = 0; +	u16 offset = 0, qmap = 0, tx_count = 0, rx_count = 0, pow = 0;  	u16 num_txq_per_tc, num_rxq_per_tc;  	u16 qcount_tx = vsi->alloc_txq;  	u16 qcount_rx = vsi->alloc_rxq; @@ -981,23 +981,25 @@ static int ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)  	 * at least 1)  	 */  	if (offset) -		vsi->num_rxq = offset; +		rx_count = offset;  	else -		vsi->num_rxq = num_rxq_per_tc; +		rx_count = num_rxq_per_tc; -	if (vsi->num_rxq > vsi->alloc_rxq) { +	if (rx_count > vsi->alloc_rxq) {  		dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Rx queues (%u), than were allocated (%u)!\n", -			vsi->num_rxq, vsi->alloc_rxq); +			rx_count, vsi->alloc_rxq);  		return -EINVAL;  	} -	vsi->num_txq = tx_count; -	if (vsi->num_txq > vsi->alloc_txq) { +	if (tx_count > vsi->alloc_txq) {  		dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Tx queues (%u), than were allocated (%u)!\n", -			vsi->num_txq, vsi->alloc_txq); +			tx_count, vsi->alloc_txq);  		return -EINVAL;  	} +	vsi->num_txq = tx_count; +	vsi->num_rxq = rx_count; +  	if (vsi->type == ICE_VSI_VF && vsi->num_txq != vsi->num_rxq) {  		dev_dbg(ice_pf_to_dev(vsi->back), "VF VSI should have same number of Tx and Rx queues. Hence making them equal\n");  		/* since there is a chance that num_rxq could have been changed @@ -3490,6 +3492,7 @@ ice_vsi_setup_q_map_mqprio(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt,  	u16 pow, offset = 0, qcount_tx = 0, qcount_rx = 0, qmap;  	u16 tc0_offset = vsi->mqprio_qopt.qopt.offset[0];  	int tc0_qcount = vsi->mqprio_qopt.qopt.count[0]; +	u16 new_txq, new_rxq;  	u8 netdev_tc = 0;  	int i; @@ -3530,21 +3533,24 @@ ice_vsi_setup_q_map_mqprio(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt,  		}  	} -	/* Set actual Tx/Rx queue pairs */ -	vsi->num_txq = offset + qcount_tx; -	if (vsi->num_txq > vsi->alloc_txq) { +	new_txq = offset + qcount_tx; +	if (new_txq > vsi->alloc_txq) {  		dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Tx queues (%u), than were allocated (%u)!\n", -			vsi->num_txq, vsi->alloc_txq); +			new_txq, vsi->alloc_txq);  		return -EINVAL;  	} -	vsi->num_rxq = offset + qcount_rx; -	if (vsi->num_rxq > vsi->alloc_rxq) { +	new_rxq = offset + qcount_rx; +	if (new_rxq > vsi->alloc_rxq) {  		dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Rx queues (%u), than were allocated (%u)!\n", -			vsi->num_rxq, vsi->alloc_rxq); +			new_rxq, vsi->alloc_rxq);  		return -EINVAL;  	} +	/* Set actual Tx/Rx queue pairs */ +	vsi->num_txq = new_txq; +	vsi->num_rxq = new_rxq; +  	/* Setup queue TC[0].qmap for given VSI context */  	ctxt->info.tc_mapping[0] = cpu_to_le16(qmap);  	ctxt->info.q_mapping[0] = cpu_to_le16(vsi->rxq_map[0]); @@ -3576,6 +3582,7 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)  {  	u16 max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 };  	struct ice_pf *pf = vsi->back; +	struct ice_tc_cfg old_tc_cfg;  	struct ice_vsi_ctx *ctx;  	struct device *dev;  	int i, ret = 0; @@ -3600,6 +3607,7 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)  			max_txqs[i] = vsi->num_txq;  	} +	memcpy(&old_tc_cfg, &vsi->tc_cfg, sizeof(old_tc_cfg));  	vsi->tc_cfg.ena_tc = ena_tc;  	vsi->tc_cfg.numtc = num_tc; @@ -3616,8 +3624,10 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)  	else  		ret = ice_vsi_setup_q_map(vsi, ctx); -	if (ret) +	if (ret) { +		memcpy(&vsi->tc_cfg, &old_tc_cfg, sizeof(vsi->tc_cfg));  		goto out; +	}  	/* must to indicate which section of VSI context are being modified */  	ctx->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_RXQ_MAP_VALID);  | 
