diff options
Diffstat (limited to 'drivers/net/vmxnet3/vmxnet3_ethtool.c')
| -rw-r--r-- | drivers/net/vmxnet3/vmxnet3_ethtool.c | 73 | 
1 files changed, 13 insertions, 60 deletions
| diff --git a/drivers/net/vmxnet3/vmxnet3_ethtool.c b/drivers/net/vmxnet3/vmxnet3_ethtool.c index 976467253d20..dc959fe27aa5 100644 --- a/drivers/net/vmxnet3/vmxnet3_ethtool.c +++ b/drivers/net/vmxnet3/vmxnet3_ethtool.c @@ -33,40 +33,6 @@ struct vmxnet3_stat_desc {  }; -static u32 -vmxnet3_get_rx_csum(struct net_device *netdev) -{ -	struct vmxnet3_adapter *adapter = netdev_priv(netdev); -	return adapter->rxcsum; -} - - -static int -vmxnet3_set_rx_csum(struct net_device *netdev, u32 val) -{ -	struct vmxnet3_adapter *adapter = netdev_priv(netdev); -	unsigned long flags; - -	if (adapter->rxcsum != val) { -		adapter->rxcsum = val; -		if (netif_running(netdev)) { -			if (val) -				adapter->shared->devRead.misc.uptFeatures |= -				UPT1_F_RXCSUM; -			else -				adapter->shared->devRead.misc.uptFeatures &= -				~UPT1_F_RXCSUM; - -			spin_lock_irqsave(&adapter->cmd_lock, flags); -			VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, -					       VMXNET3_CMD_UPDATE_FEATURE); -			spin_unlock_irqrestore(&adapter->cmd_lock, flags); -		} -	} -	return 0; -} - -  /* per tq stats maintained by the device */  static const struct vmxnet3_stat_desc  vmxnet3_tq_dev_stats[] = { @@ -296,31 +262,28 @@ vmxnet3_get_strings(struct net_device *netdev, u32 stringset, u8 *buf)  	}  } -static int -vmxnet3_set_flags(struct net_device *netdev, u32 data) +int vmxnet3_set_features(struct net_device *netdev, u32 features)  {  	struct vmxnet3_adapter *adapter = netdev_priv(netdev); -	u8 lro_requested = (data & ETH_FLAG_LRO) == 0 ? 0 : 1; -	u8 lro_present = (netdev->features & NETIF_F_LRO) == 0 ? 0 : 1;  	unsigned long flags; +	u32 changed = features ^ netdev->features; -	if (ethtool_invalid_flags(netdev, data, ETH_FLAG_LRO)) -		return -EINVAL; - -	if (lro_requested ^ lro_present) { -		/* toggle the LRO feature*/ -		netdev->features ^= NETIF_F_LRO; - -		/* Update private LRO flag */ -		adapter->lro = lro_requested; +	if (changed & (NETIF_F_RXCSUM|NETIF_F_LRO)) { +		if (features & NETIF_F_RXCSUM) +			adapter->shared->devRead.misc.uptFeatures |= +			UPT1_F_RXCSUM; +		else +			adapter->shared->devRead.misc.uptFeatures &= +			~UPT1_F_RXCSUM;  		/* update harware LRO capability accordingly */ -		if (lro_requested) +		if (features & NETIF_F_LRO)  			adapter->shared->devRead.misc.uptFeatures |=  							UPT1_F_LRO;  		else  			adapter->shared->devRead.misc.uptFeatures &=  							~UPT1_F_LRO; +  		spin_lock_irqsave(&adapter->cmd_lock, flags);  		VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,  				       VMXNET3_CMD_UPDATE_FEATURE); @@ -462,10 +425,10 @@ vmxnet3_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)  	ecmd->transceiver = XCVR_INTERNAL;  	if (adapter->link_speed) { -		ecmd->speed = adapter->link_speed; +		ethtool_cmd_speed_set(ecmd, adapter->link_speed);  		ecmd->duplex = DUPLEX_FULL;  	} else { -		ecmd->speed = -1; +		ethtool_cmd_speed_set(ecmd, -1);  		ecmd->duplex = -1;  	}  	return 0; @@ -657,17 +620,7 @@ static struct ethtool_ops vmxnet3_ethtool_ops = {  	.get_wol           = vmxnet3_get_wol,  	.set_wol           = vmxnet3_set_wol,  	.get_link          = ethtool_op_get_link, -	.get_rx_csum       = vmxnet3_get_rx_csum, -	.set_rx_csum       = vmxnet3_set_rx_csum, -	.get_tx_csum       = ethtool_op_get_tx_csum, -	.set_tx_csum       = ethtool_op_set_tx_hw_csum, -	.get_sg            = ethtool_op_get_sg, -	.set_sg            = ethtool_op_set_sg, -	.get_tso           = ethtool_op_get_tso, -	.set_tso           = ethtool_op_set_tso,  	.get_strings       = vmxnet3_get_strings, -	.get_flags	   = ethtool_op_get_flags, -	.set_flags	   = vmxnet3_set_flags,  	.get_sset_count	   = vmxnet3_get_sset_count,  	.get_ethtool_stats = vmxnet3_get_ethtool_stats,  	.get_ringparam     = vmxnet3_get_ringparam, |