diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_ethtool.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_ethtool.c | 28 | 
1 files changed, 24 insertions, 4 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c index 4191994d8f3a..a359f1610fc1 100644 --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c @@ -3641,7 +3641,9 @@ static int ice_set_channels(struct net_device *dev, struct ethtool_channels *ch)  	struct ice_vsi *vsi = np->vsi;  	struct ice_pf *pf = vsi->back;  	int new_rx = 0, new_tx = 0; +	bool locked = false;  	u32 curr_combined; +	int ret = 0;  	/* do not support changing channels in Safe Mode */  	if (ice_is_safe_mode(pf)) { @@ -3705,15 +3707,33 @@ static int ice_set_channels(struct net_device *dev, struct ethtool_channels *ch)  		return -EINVAL;  	} -	ice_vsi_recfg_qs(vsi, new_rx, new_tx); +	if (pf->adev) { +		mutex_lock(&pf->adev_mutex); +		device_lock(&pf->adev->dev); +		locked = true; +		if (pf->adev->dev.driver) { +			netdev_err(dev, "Cannot change channels when RDMA is active\n"); +			ret = -EBUSY; +			goto adev_unlock; +		} +	} + +	ice_vsi_recfg_qs(vsi, new_rx, new_tx, locked); -	if (!netif_is_rxfh_configured(dev)) -		return ice_vsi_set_dflt_rss_lut(vsi, new_rx); +	if (!netif_is_rxfh_configured(dev)) { +		ret = ice_vsi_set_dflt_rss_lut(vsi, new_rx); +		goto adev_unlock; +	}  	/* Update rss_size due to change in Rx queues */  	vsi->rss_size = ice_get_valid_rss_size(&pf->hw, new_rx); -	return 0; +adev_unlock: +	if (locked) { +		device_unlock(&pf->adev->dev); +		mutex_unlock(&pf->adev_mutex); +	} +	return ret;  }  /** |