|
@@ -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,28 +262,27 @@ 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;
|
|
|
+ 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);
|
|
@@ -654,17 +619,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,
|