Commit e97d3207 authored by Michał Mirosław's avatar Michał Mirosław Committed by Jeff Kirsher

e1000: convert to ndo_fix_features

Private rx_csum flags are now duplicate of netdev->features & NETIF_F_RXCSUM.
Removing this needs deeper surgery.

Things noticed:
 - RX csum disabled by default
 - HW VLAN acceleration probably can be toggled, but it's left as is
 - the resets on RX csum offload change can probably be avoided
 - there is A LOT of copy-and-pasted code here
Signed-off-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 9f6ec8d6
...@@ -290,69 +290,6 @@ static int e1000_set_pauseparam(struct net_device *netdev, ...@@ -290,69 +290,6 @@ static int e1000_set_pauseparam(struct net_device *netdev,
return retval; return retval;
} }
static u32 e1000_get_rx_csum(struct net_device *netdev)
{
struct e1000_adapter *adapter = netdev_priv(netdev);
return adapter->rx_csum;
}
static int e1000_set_rx_csum(struct net_device *netdev, u32 data)
{
struct e1000_adapter *adapter = netdev_priv(netdev);
adapter->rx_csum = data;
if (netif_running(netdev))
e1000_reinit_locked(adapter);
else
e1000_reset(adapter);
return 0;
}
static u32 e1000_get_tx_csum(struct net_device *netdev)
{
return (netdev->features & NETIF_F_HW_CSUM) != 0;
}
static int e1000_set_tx_csum(struct net_device *netdev, u32 data)
{
struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw;
if (hw->mac_type < e1000_82543) {
if (!data)
return -EINVAL;
return 0;
}
if (data)
netdev->features |= NETIF_F_HW_CSUM;
else
netdev->features &= ~NETIF_F_HW_CSUM;
return 0;
}
static int e1000_set_tso(struct net_device *netdev, u32 data)
{
struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw;
if ((hw->mac_type < e1000_82544) ||
(hw->mac_type == e1000_82547))
return data ? -EINVAL : 0;
if (data)
netdev->features |= NETIF_F_TSO;
else
netdev->features &= ~NETIF_F_TSO;
netdev->features &= ~NETIF_F_TSO6;
e_info(probe, "TSO is %s\n", data ? "Enabled" : "Disabled");
adapter->tso_force = true;
return 0;
}
static u32 e1000_get_msglevel(struct net_device *netdev) static u32 e1000_get_msglevel(struct net_device *netdev)
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
...@@ -1905,12 +1842,6 @@ static const struct ethtool_ops e1000_ethtool_ops = { ...@@ -1905,12 +1842,6 @@ static const struct ethtool_ops e1000_ethtool_ops = {
.set_ringparam = e1000_set_ringparam, .set_ringparam = e1000_set_ringparam,
.get_pauseparam = e1000_get_pauseparam, .get_pauseparam = e1000_get_pauseparam,
.set_pauseparam = e1000_set_pauseparam, .set_pauseparam = e1000_set_pauseparam,
.get_rx_csum = e1000_get_rx_csum,
.set_rx_csum = e1000_set_rx_csum,
.get_tx_csum = e1000_get_tx_csum,
.set_tx_csum = e1000_set_tx_csum,
.set_sg = ethtool_op_set_sg,
.set_tso = e1000_set_tso,
.self_test = e1000_diag_test, .self_test = e1000_diag_test,
.get_strings = e1000_get_strings, .get_strings = e1000_get_strings,
.set_phys_id = e1000_set_phys_id, .set_phys_id = e1000_set_phys_id,
......
...@@ -797,6 +797,24 @@ static int e1000_is_need_ioport(struct pci_dev *pdev) ...@@ -797,6 +797,24 @@ static int e1000_is_need_ioport(struct pci_dev *pdev)
} }
} }
static int e1000_set_features(struct net_device *netdev, u32 features)
{
struct e1000_adapter *adapter = netdev_priv(netdev);
u32 changed = features ^ netdev->features;
if (!(changed & NETIF_F_RXCSUM))
return 0;
adapter->rx_csum = !!(features & NETIF_F_RXCSUM);
if (netif_running(netdev))
e1000_reinit_locked(adapter);
else
e1000_reset(adapter);
return 0;
}
static const struct net_device_ops e1000_netdev_ops = { static const struct net_device_ops e1000_netdev_ops = {
.ndo_open = e1000_open, .ndo_open = e1000_open,
.ndo_stop = e1000_close, .ndo_stop = e1000_close,
...@@ -815,6 +833,7 @@ static const struct net_device_ops e1000_netdev_ops = { ...@@ -815,6 +833,7 @@ static const struct net_device_ops e1000_netdev_ops = {
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = e1000_netpoll, .ndo_poll_controller = e1000_netpoll,
#endif #endif
.ndo_set_features = e1000_set_features,
}; };
/** /**
...@@ -1016,16 +1035,19 @@ static int __devinit e1000_probe(struct pci_dev *pdev, ...@@ -1016,16 +1035,19 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
} }
if (hw->mac_type >= e1000_82543) { if (hw->mac_type >= e1000_82543) {
netdev->features = NETIF_F_SG | netdev->hw_features = NETIF_F_SG |
NETIF_F_HW_CSUM | NETIF_F_HW_CSUM;
NETIF_F_HW_VLAN_TX | netdev->features = NETIF_F_HW_VLAN_TX |
NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_RX |
NETIF_F_HW_VLAN_FILTER; NETIF_F_HW_VLAN_FILTER;
} }
if ((hw->mac_type >= e1000_82544) && if ((hw->mac_type >= e1000_82544) &&
(hw->mac_type != e1000_82547)) (hw->mac_type != e1000_82547))
netdev->features |= NETIF_F_TSO; netdev->hw_features |= NETIF_F_TSO;
netdev->features |= netdev->hw_features;
netdev->hw_features |= NETIF_F_RXCSUM;
if (pci_using_dac) { if (pci_using_dac) {
netdev->features |= NETIF_F_HIGHDMA; netdev->features |= NETIF_F_HIGHDMA;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment