diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_ethtool.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_ethtool.c | 103 | 
1 files changed, 71 insertions, 32 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c index 4191994d8f3a..f86e814354a3 100644 --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c @@ -656,7 +656,7 @@ static int ice_lbtest_prepare_rings(struct ice_vsi *vsi)  	if (status)  		goto err_setup_rx_ring; -	status = ice_vsi_cfg(vsi); +	status = ice_vsi_cfg_lan(vsi);  	if (status)  		goto err_setup_rx_ring; @@ -664,7 +664,7 @@ static int ice_lbtest_prepare_rings(struct ice_vsi *vsi)  	if (status)  		goto err_start_rx_ring; -	return status; +	return 0;  err_start_rx_ring:  	ice_vsi_free_rx_rings(vsi); @@ -1950,8 +1950,7 @@ ice_phy_type_to_ethtool(struct net_device *netdev,  			   ICE_PHY_TYPE_LOW_100G_CAUI4 |  			   ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC |  			   ICE_PHY_TYPE_LOW_100G_AUI4 | -			   ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4 | -			   ICE_PHY_TYPE_LOW_100GBASE_CP2; +			   ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4;  	phy_type_mask_hi = ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC |  			   ICE_PHY_TYPE_HIGH_100G_CAUI2 |  			   ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC | @@ -1964,15 +1963,27 @@ ice_phy_type_to_ethtool(struct net_device *netdev,  						100000baseCR4_Full);  	} -	phy_type_mask_lo = ICE_PHY_TYPE_LOW_100GBASE_SR4 | -			   ICE_PHY_TYPE_LOW_100GBASE_SR2; -	if (phy_types_low & phy_type_mask_lo) { +	if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_CP2) { +		ethtool_link_ksettings_add_link_mode(ks, supported, +						     100000baseCR2_Full); +		ice_ethtool_advertise_link_mode(ICE_AQ_LINK_SPEED_100GB, +						100000baseCR2_Full); +	} + +	if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_SR4) {  		ethtool_link_ksettings_add_link_mode(ks, supported,  						     100000baseSR4_Full);  		ice_ethtool_advertise_link_mode(ICE_AQ_LINK_SPEED_100GB,  						100000baseSR4_Full);  	} +	if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_SR2) { +		ethtool_link_ksettings_add_link_mode(ks, supported, +						     100000baseSR2_Full); +		ice_ethtool_advertise_link_mode(ICE_AQ_LINK_SPEED_100GB, +						100000baseSR2_Full); +	} +  	phy_type_mask_lo = ICE_PHY_TYPE_LOW_100GBASE_LR4 |  			   ICE_PHY_TYPE_LOW_100GBASE_DR;  	if (phy_types_low & phy_type_mask_lo) { @@ -1984,14 +1995,20 @@ ice_phy_type_to_ethtool(struct net_device *netdev,  	phy_type_mask_lo = ICE_PHY_TYPE_LOW_100GBASE_KR4 |  			   ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4; -	phy_type_mask_hi = ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4; -	if (phy_types_low & phy_type_mask_lo || -	    phy_types_high & phy_type_mask_hi) { +	if (phy_types_low & phy_type_mask_lo) {  		ethtool_link_ksettings_add_link_mode(ks, supported,  						     100000baseKR4_Full);  		ice_ethtool_advertise_link_mode(ICE_AQ_LINK_SPEED_100GB,  						100000baseKR4_Full);  	} + +	if (phy_types_high & ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4) { +		ethtool_link_ksettings_add_link_mode(ks, supported, +						     100000baseKR2_Full); +		ice_ethtool_advertise_link_mode(ICE_AQ_LINK_SPEED_100GB, +						100000baseKR2_Full); +	} +  }  #define TEST_SET_BITS_TIMEOUT	50 @@ -2242,17 +2259,15 @@ ice_ksettings_find_adv_link_speed(const struct ethtool_link_ksettings *ks)  						  100baseT_Full))  		adv_link_speed |= ICE_AQ_LINK_SPEED_100MB;  	if (ethtool_link_ksettings_test_link_mode(ks, advertising, -						  1000baseX_Full)) -		adv_link_speed |= ICE_AQ_LINK_SPEED_1000MB; -	if (ethtool_link_ksettings_test_link_mode(ks, advertising, +						  1000baseX_Full) || +	    ethtool_link_ksettings_test_link_mode(ks, advertising,  						  1000baseT_Full) ||  	    ethtool_link_ksettings_test_link_mode(ks, advertising,  						  1000baseKX_Full))  		adv_link_speed |= ICE_AQ_LINK_SPEED_1000MB;  	if (ethtool_link_ksettings_test_link_mode(ks, advertising, -						  2500baseT_Full)) -		adv_link_speed |= ICE_AQ_LINK_SPEED_2500MB; -	if (ethtool_link_ksettings_test_link_mode(ks, advertising, +						  2500baseT_Full) || +	    ethtool_link_ksettings_test_link_mode(ks, advertising,  						  2500baseX_Full))  		adv_link_speed |= ICE_AQ_LINK_SPEED_2500MB;  	if (ethtool_link_ksettings_test_link_mode(ks, advertising, @@ -2261,9 +2276,8 @@ ice_ksettings_find_adv_link_speed(const struct ethtool_link_ksettings *ks)  	if (ethtool_link_ksettings_test_link_mode(ks, advertising,  						  10000baseT_Full) ||  	    ethtool_link_ksettings_test_link_mode(ks, advertising, -						  10000baseKR_Full)) -		adv_link_speed |= ICE_AQ_LINK_SPEED_10GB; -	if (ethtool_link_ksettings_test_link_mode(ks, advertising, +						  10000baseKR_Full) || +	    ethtool_link_ksettings_test_link_mode(ks, advertising,  						  10000baseSR_Full) ||  	    ethtool_link_ksettings_test_link_mode(ks, advertising,  						  10000baseLR_Full)) @@ -2287,9 +2301,8 @@ ice_ksettings_find_adv_link_speed(const struct ethtool_link_ksettings *ks)  	if (ethtool_link_ksettings_test_link_mode(ks, advertising,  						  50000baseCR2_Full) ||  	    ethtool_link_ksettings_test_link_mode(ks, advertising, -						  50000baseKR2_Full)) -		adv_link_speed |= ICE_AQ_LINK_SPEED_50GB; -	if (ethtool_link_ksettings_test_link_mode(ks, advertising, +						  50000baseKR2_Full) || +	    ethtool_link_ksettings_test_link_mode(ks, advertising,  						  50000baseSR2_Full))  		adv_link_speed |= ICE_AQ_LINK_SPEED_50GB;  	if (ethtool_link_ksettings_test_link_mode(ks, advertising, @@ -2299,7 +2312,13 @@ ice_ksettings_find_adv_link_speed(const struct ethtool_link_ksettings *ks)  	    ethtool_link_ksettings_test_link_mode(ks, advertising,  						  100000baseLR4_ER4_Full) ||  	    ethtool_link_ksettings_test_link_mode(ks, advertising, -						  100000baseKR4_Full)) +						  100000baseKR4_Full) || +	    ethtool_link_ksettings_test_link_mode(ks, advertising, +						  100000baseCR2_Full) || +	    ethtool_link_ksettings_test_link_mode(ks, advertising, +						  100000baseSR2_Full) || +	    ethtool_link_ksettings_test_link_mode(ks, advertising, +						  100000baseKR2_Full))  		adv_link_speed |= ICE_AQ_LINK_SPEED_100GB;  	return adv_link_speed; @@ -3027,8 +3046,6 @@ ice_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring,  		/* clone ring and setup updated count */  		xdp_rings[i] = *vsi->xdp_rings[i];  		xdp_rings[i].count = new_tx_cnt; -		xdp_rings[i].next_dd = ICE_RING_QUARTER(&xdp_rings[i]) - 1; -		xdp_rings[i].next_rs = ICE_RING_QUARTER(&xdp_rings[i]) - 1;  		xdp_rings[i].desc = NULL;  		xdp_rings[i].tx_buf = NULL;  		err = ice_setup_tx_ring(&xdp_rings[i]); @@ -3073,7 +3090,7 @@ process_rx:  		/* allocate Rx buffers */  		err = ice_alloc_rx_bufs(&rx_rings[i], -					ICE_DESC_UNUSED(&rx_rings[i])); +					ICE_RX_DESC_UNUSED(&rx_rings[i]));  rx_unwind:  		if (err) {  			while (i) { @@ -3641,7 +3658,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 +3724,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; +		} +	} -	if (!netif_is_rxfh_configured(dev)) -		return ice_vsi_set_dflt_rss_lut(vsi, new_rx); +	ice_vsi_recfg_qs(vsi, new_rx, new_tx, locked); + +	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;  }  /** @@ -4294,6 +4331,8 @@ ice_get_module_eeprom(struct net_device *netdev,  		 * SFP modules only ever use page 0.  		 */  		if (page == 0 || !(data[0x2] & 0x4)) { +			u32 copy_len; +  			/* If i2c bus is busy due to slow page change or  			 * link management access, call can fail. This is normal.  			 * So we retry this a few times. @@ -4317,8 +4356,8 @@ ice_get_module_eeprom(struct net_device *netdev,  			}  			/* Make sure we have enough room for the new block */ -			if ((i + SFF_READ_BLOCK_SIZE) < ee->len) -				memcpy(data + i, value, SFF_READ_BLOCK_SIZE); +			copy_len = min_t(u32, SFF_READ_BLOCK_SIZE, ee->len - i); +			memcpy(data + i, value, copy_len);  		}  	}  	return 0;  |