diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igc/igc_ethtool.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_ethtool.c | 31 | 
1 files changed, 19 insertions, 12 deletions
diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c index 93bce729be76..7ab6dd58e400 100644 --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c @@ -868,6 +868,18 @@ static void igc_ethtool_get_stats(struct net_device *netdev,  	spin_unlock(&adapter->stats64_lock);  } +static int igc_ethtool_get_previous_rx_coalesce(struct igc_adapter *adapter) +{ +	return (adapter->rx_itr_setting <= 3) ? +		adapter->rx_itr_setting : adapter->rx_itr_setting >> 2; +} + +static int igc_ethtool_get_previous_tx_coalesce(struct igc_adapter *adapter) +{ +	return (adapter->tx_itr_setting <= 3) ? +		adapter->tx_itr_setting : adapter->tx_itr_setting >> 2; +} +  static int igc_ethtool_get_coalesce(struct net_device *netdev,  				    struct ethtool_coalesce *ec,  				    struct kernel_ethtool_coalesce *kernel_coal, @@ -875,17 +887,8 @@ static int igc_ethtool_get_coalesce(struct net_device *netdev,  {  	struct igc_adapter *adapter = netdev_priv(netdev); -	if (adapter->rx_itr_setting <= 3) -		ec->rx_coalesce_usecs = adapter->rx_itr_setting; -	else -		ec->rx_coalesce_usecs = adapter->rx_itr_setting >> 2; - -	if (!(adapter->flags & IGC_FLAG_QUEUE_PAIRS)) { -		if (adapter->tx_itr_setting <= 3) -			ec->tx_coalesce_usecs = adapter->tx_itr_setting; -		else -			ec->tx_coalesce_usecs = adapter->tx_itr_setting >> 2; -	} +	ec->rx_coalesce_usecs = igc_ethtool_get_previous_rx_coalesce(adapter); +	ec->tx_coalesce_usecs = igc_ethtool_get_previous_tx_coalesce(adapter);  	return 0;  } @@ -910,8 +913,12 @@ static int igc_ethtool_set_coalesce(struct net_device *netdev,  	    ec->tx_coalesce_usecs == 2)  		return -EINVAL; -	if ((adapter->flags & IGC_FLAG_QUEUE_PAIRS) && ec->tx_coalesce_usecs) +	if ((adapter->flags & IGC_FLAG_QUEUE_PAIRS) && +	    ec->tx_coalesce_usecs != igc_ethtool_get_previous_tx_coalesce(adapter)) { +		NL_SET_ERR_MSG_MOD(extack, +				   "Queue Pair mode enabled, both Rx and Tx coalescing controlled by rx-usecs");  		return -EINVAL; +	}  	/* If ITR is disabled, disable DMAC */  	if (ec->rx_coalesce_usecs == 0) {  | 
