diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 33 | 
1 files changed, 23 insertions, 10 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 93979ab18bc1..f02d44455772 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -4430,9 +4430,9 @@ static int ice_start_eth(struct ice_vsi *vsi)  	if (err)  		return err; -	rtnl_lock();  	err = ice_vsi_open(vsi); -	rtnl_unlock(); +	if (err) +		ice_fltr_remove_all(vsi);  	return err;  } @@ -4895,6 +4895,7 @@ int ice_load(struct ice_pf *pf)  	params = ice_vsi_to_params(vsi);  	params.flags = ICE_VSI_FLAG_INIT; +	rtnl_lock();  	err = ice_vsi_cfg(vsi, ¶ms);  	if (err)  		goto err_vsi_cfg; @@ -4902,6 +4903,7 @@ int ice_load(struct ice_pf *pf)  	err = ice_start_eth(ice_get_main_vsi(pf));  	if (err)  		goto err_start_eth; +	rtnl_unlock();  	err = ice_init_rdma(pf);  	if (err) @@ -4916,9 +4918,11 @@ int ice_load(struct ice_pf *pf)  err_init_rdma:  	ice_vsi_close(ice_get_main_vsi(pf)); +	rtnl_lock();  err_start_eth:  	ice_vsi_decfg(ice_get_main_vsi(pf));  err_vsi_cfg: +	rtnl_unlock();  	ice_deinit_dev(pf);  	return err;  } @@ -4931,8 +4935,10 @@ void ice_unload(struct ice_pf *pf)  {  	ice_deinit_features(pf);  	ice_deinit_rdma(pf); +	rtnl_lock();  	ice_stop_eth(ice_get_main_vsi(pf));  	ice_vsi_decfg(ice_get_main_vsi(pf)); +	rtnl_unlock();  	ice_deinit_dev(pf);  } @@ -5739,6 +5745,13 @@ ice_set_tx_maxrate(struct net_device *netdev, int queue_index, u32 maxrate)  	q_handle = vsi->tx_rings[queue_index]->q_handle;  	tc = ice_dcb_get_tc(vsi, queue_index); +	vsi = ice_locate_vsi_using_queue(vsi, queue_index); +	if (!vsi) { +		netdev_err(netdev, "Invalid VSI for given queue %d\n", +			   queue_index); +		return -EINVAL; +	} +  	/* Set BW back to default, when user set maxrate to 0 */  	if (!maxrate)  		status = ice_cfg_q_bw_dflt_lmt(vsi->port_info, vsi->idx, tc, @@ -7872,10 +7885,10 @@ static int  ice_validate_mqprio_qopt(struct ice_vsi *vsi,  			 struct tc_mqprio_qopt_offload *mqprio_qopt)  { -	u64 sum_max_rate = 0, sum_min_rate = 0;  	int non_power_of_2_qcount = 0;  	struct ice_pf *pf = vsi->back;  	int max_rss_q_cnt = 0; +	u64 sum_min_rate = 0;  	struct device *dev;  	int i, speed;  	u8 num_tc; @@ -7891,6 +7904,7 @@ ice_validate_mqprio_qopt(struct ice_vsi *vsi,  	dev = ice_pf_to_dev(pf);  	vsi->ch_rss_size = 0;  	num_tc = mqprio_qopt->qopt.num_tc; +	speed = ice_get_link_speed_kbps(vsi);  	for (i = 0; num_tc; i++) {  		int qcount = mqprio_qopt->qopt.count[i]; @@ -7931,7 +7945,6 @@ ice_validate_mqprio_qopt(struct ice_vsi *vsi,  		 */  		max_rate = mqprio_qopt->max_rate[i];  		max_rate = div_u64(max_rate, ICE_BW_KBPS_DIVISOR); -		sum_max_rate += max_rate;  		/* min_rate is minimum guaranteed rate and it can't be zero */  		min_rate = mqprio_qopt->min_rate[i]; @@ -7944,6 +7957,12 @@ ice_validate_mqprio_qopt(struct ice_vsi *vsi,  			return -EINVAL;  		} +		if (max_rate && max_rate > speed) { +			dev_err(dev, "TC%d: max_rate(%llu Kbps) > link speed of %u Kbps\n", +				i, max_rate, speed); +			return -EINVAL; +		} +  		iter_div_u64_rem(min_rate, ICE_MIN_BW_LIMIT, &rem);  		if (rem) {  			dev_err(dev, "TC%d: Min Rate not multiple of %u Kbps", @@ -7981,12 +8000,6 @@ ice_validate_mqprio_qopt(struct ice_vsi *vsi,  	    (mqprio_qopt->qopt.offset[i] + mqprio_qopt->qopt.count[i]))  		return -EINVAL; -	speed = ice_get_link_speed_kbps(vsi); -	if (sum_max_rate && sum_max_rate > (u64)speed) { -		dev_err(dev, "Invalid max Tx rate(%llu) Kbps > speed(%u) Kbps specified\n", -			sum_max_rate, speed); -		return -EINVAL; -	}  	if (sum_min_rate && sum_min_rate > (u64)speed) {  		dev_err(dev, "Invalid min Tx rate(%llu) Kbps > speed (%u) Kbps specified\n",  			sum_min_rate, speed); | 
