diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_lib.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_lib.c | 63 | 
1 files changed, 49 insertions, 14 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index 2774cbd5b12a..f7f9c973ec54 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c @@ -909,7 +909,7 @@ static void ice_set_dflt_vsi_ctx(struct ice_hw *hw, struct ice_vsi_ctx *ctxt)   * @vsi: the VSI being configured   * @ctxt: VSI context structure   */ -static void ice_vsi_setup_q_map(struct ice_vsi *vsi, 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 num_txq_per_tc, num_rxq_per_tc; @@ -982,7 +982,18 @@ static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)  	else  		vsi->num_rxq = num_rxq_per_tc; +	if (vsi->num_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); +		return -EINVAL; +	} +  	vsi->num_txq = tx_count; +	if (vsi->num_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); +		return -EINVAL; +	}  	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"); @@ -1000,6 +1011,8 @@ static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)  	 */  	ctxt->info.q_mapping[0] = cpu_to_le16(vsi->rxq_map[0]);  	ctxt->info.q_mapping[1] = cpu_to_le16(vsi->num_rxq); + +	return 0;  }  /** @@ -1187,7 +1200,10 @@ static int ice_vsi_init(struct ice_vsi *vsi, bool init_vsi)  	if (vsi->type == ICE_VSI_CHNL) {  		ice_chnl_vsi_setup_q_map(vsi, ctxt);  	} else { -		ice_vsi_setup_q_map(vsi, ctxt); +		ret = ice_vsi_setup_q_map(vsi, ctxt); +		if (ret) +			goto out; +  		if (!init_vsi) /* means VSI being updated */  			/* must to indicate which section of VSI context are  			 * being modified @@ -2689,6 +2705,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)  		return;  	vsi->irqs_ready = false; +	ice_free_cpu_rx_rmap(vsi); +  	ice_for_each_q_vector(vsi, i) {  		u16 vector = i + base;  		int irq_num; @@ -2702,7 +2720,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)  			continue;  		/* clear the affinity notifier in the IRQ descriptor */ -		irq_set_affinity_notifier(irq_num, NULL); +		if (!IS_ENABLED(CONFIG_RFS_ACCEL)) +			irq_set_affinity_notifier(irq_num, NULL);  		/* clear the affinity_mask in the IRQ descriptor */  		irq_set_affinity_hint(irq_num, NULL); @@ -3040,8 +3059,8 @@ ice_vsi_rebuild_get_coalesce(struct ice_vsi *vsi,  	ice_for_each_q_vector(vsi, i) {  		struct ice_q_vector *q_vector = vsi->q_vectors[i]; -		coalesce[i].itr_tx = q_vector->tx.itr_setting; -		coalesce[i].itr_rx = q_vector->rx.itr_setting; +		coalesce[i].itr_tx = q_vector->tx.itr_settings; +		coalesce[i].itr_rx = q_vector->rx.itr_settings;  		coalesce[i].intrl = q_vector->intrl;  		if (i < vsi->num_txq) @@ -3097,21 +3116,21 @@ ice_vsi_rebuild_set_coalesce(struct ice_vsi *vsi,  		 */  		if (i < vsi->alloc_rxq && coalesce[i].rx_valid) {  			rc = &vsi->q_vectors[i]->rx; -			rc->itr_setting = coalesce[i].itr_rx; +			rc->itr_settings = coalesce[i].itr_rx;  			ice_write_itr(rc, rc->itr_setting);  		} else if (i < vsi->alloc_rxq) {  			rc = &vsi->q_vectors[i]->rx; -			rc->itr_setting = coalesce[0].itr_rx; +			rc->itr_settings = coalesce[0].itr_rx;  			ice_write_itr(rc, rc->itr_setting);  		}  		if (i < vsi->alloc_txq && coalesce[i].tx_valid) {  			rc = &vsi->q_vectors[i]->tx; -			rc->itr_setting = coalesce[i].itr_tx; +			rc->itr_settings = coalesce[i].itr_tx;  			ice_write_itr(rc, rc->itr_setting);  		} else if (i < vsi->alloc_txq) {  			rc = &vsi->q_vectors[i]->tx; -			rc->itr_setting = coalesce[0].itr_tx; +			rc->itr_settings = coalesce[0].itr_tx;  			ice_write_itr(rc, rc->itr_setting);  		} @@ -3125,12 +3144,12 @@ ice_vsi_rebuild_set_coalesce(struct ice_vsi *vsi,  	for (; i < vsi->num_q_vectors; i++) {  		/* transmit */  		rc = &vsi->q_vectors[i]->tx; -		rc->itr_setting = coalesce[0].itr_tx; +		rc->itr_settings = coalesce[0].itr_tx;  		ice_write_itr(rc, rc->itr_setting);  		/* receive */  		rc = &vsi->q_vectors[i]->rx; -		rc->itr_setting = coalesce[0].itr_rx; +		rc->itr_settings = coalesce[0].itr_rx;  		ice_write_itr(rc, rc->itr_setting);  		vsi->q_vectors[i]->intrl = coalesce[0].intrl; @@ -3461,7 +3480,7 @@ void ice_vsi_cfg_netdev_tc(struct ice_vsi *vsi, u8 ena_tc)   *   * Prepares VSI tc_config to have queue configurations based on MQPRIO options.   */ -static void +static int  ice_vsi_setup_q_map_mqprio(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt,  			   u8 ena_tc)  { @@ -3510,7 +3529,18 @@ 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) { +		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); +		return -EINVAL; +	} +  	vsi->num_rxq = offset + qcount_rx; +	if (vsi->num_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); +		return -EINVAL; +	}  	/* Setup queue TC[0].qmap for given VSI context */  	ctxt->info.tc_mapping[0] = cpu_to_le16(qmap); @@ -3528,6 +3558,8 @@ ice_vsi_setup_q_map_mqprio(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt,  	dev_dbg(ice_pf_to_dev(vsi->back), "vsi->num_rxq = %d\n",  vsi->num_rxq);  	dev_dbg(ice_pf_to_dev(vsi->back), "all_numtc %u, all_enatc: 0x%04x, tc_cfg.numtc %u\n",  		vsi->all_numtc, vsi->all_enatc, vsi->tc_cfg.numtc); + +	return 0;  }  /** @@ -3577,9 +3609,12 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)  	if (vsi->type == ICE_VSI_PF &&  	    test_bit(ICE_FLAG_TC_MQPRIO, pf->flags)) -		ice_vsi_setup_q_map_mqprio(vsi, ctx, ena_tc); +		ret = ice_vsi_setup_q_map_mqprio(vsi, ctx, ena_tc);  	else -		ice_vsi_setup_q_map(vsi, ctx); +		ret = ice_vsi_setup_q_map(vsi, ctx); + +	if (ret) +		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); |