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

ixgb: 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:
 - ixgb has 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>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent f78a5fda
...@@ -204,6 +204,8 @@ extern void ixgb_set_ethtool_ops(struct net_device *netdev); ...@@ -204,6 +204,8 @@ extern void ixgb_set_ethtool_ops(struct net_device *netdev);
extern char ixgb_driver_name[]; extern char ixgb_driver_name[];
extern const char ixgb_driver_version[]; extern const char ixgb_driver_version[];
extern void ixgb_set_speed_duplex(struct net_device *netdev);
extern int ixgb_up(struct ixgb_adapter *adapter); extern int ixgb_up(struct ixgb_adapter *adapter);
extern void ixgb_down(struct ixgb_adapter *adapter, bool kill_watchdog); extern void ixgb_down(struct ixgb_adapter *adapter, bool kill_watchdog);
extern void ixgb_reset(struct ixgb_adapter *adapter); extern void ixgb_reset(struct ixgb_adapter *adapter);
......
...@@ -115,7 +115,7 @@ ixgb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) ...@@ -115,7 +115,7 @@ ixgb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
return 0; return 0;
} }
static void ixgb_set_speed_duplex(struct net_device *netdev) void ixgb_set_speed_duplex(struct net_device *netdev)
{ {
struct ixgb_adapter *adapter = netdev_priv(netdev); struct ixgb_adapter *adapter = netdev_priv(netdev);
/* be optimistic about our link, since we were up before */ /* be optimistic about our link, since we were up before */
...@@ -194,57 +194,6 @@ ixgb_set_pauseparam(struct net_device *netdev, ...@@ -194,57 +194,6 @@ ixgb_set_pauseparam(struct net_device *netdev,
return 0; return 0;
} }
static u32
ixgb_get_rx_csum(struct net_device *netdev)
{
struct ixgb_adapter *adapter = netdev_priv(netdev);
return adapter->rx_csum;
}
static int
ixgb_set_rx_csum(struct net_device *netdev, u32 data)
{
struct ixgb_adapter *adapter = netdev_priv(netdev);
adapter->rx_csum = data;
if (netif_running(netdev)) {
ixgb_down(adapter, true);
ixgb_up(adapter);
ixgb_set_speed_duplex(netdev);
} else
ixgb_reset(adapter);
return 0;
}
static u32
ixgb_get_tx_csum(struct net_device *netdev)
{
return (netdev->features & NETIF_F_HW_CSUM) != 0;
}
static int
ixgb_set_tx_csum(struct net_device *netdev, u32 data)
{
if (data)
netdev->features |= NETIF_F_HW_CSUM;
else
netdev->features &= ~NETIF_F_HW_CSUM;
return 0;
}
static int
ixgb_set_tso(struct net_device *netdev, u32 data)
{
if (data)
netdev->features |= NETIF_F_TSO;
else
netdev->features &= ~NETIF_F_TSO;
return 0;
}
static u32 static u32
ixgb_get_msglevel(struct net_device *netdev) ixgb_get_msglevel(struct net_device *netdev)
{ {
...@@ -736,14 +685,8 @@ static const struct ethtool_ops ixgb_ethtool_ops = { ...@@ -736,14 +685,8 @@ static const struct ethtool_ops ixgb_ethtool_ops = {
.set_ringparam = ixgb_set_ringparam, .set_ringparam = ixgb_set_ringparam,
.get_pauseparam = ixgb_get_pauseparam, .get_pauseparam = ixgb_get_pauseparam,
.set_pauseparam = ixgb_set_pauseparam, .set_pauseparam = ixgb_set_pauseparam,
.get_rx_csum = ixgb_get_rx_csum,
.set_rx_csum = ixgb_set_rx_csum,
.get_tx_csum = ixgb_get_tx_csum,
.set_tx_csum = ixgb_set_tx_csum,
.set_sg = ethtool_op_set_sg,
.get_msglevel = ixgb_get_msglevel, .get_msglevel = ixgb_get_msglevel,
.set_msglevel = ixgb_set_msglevel, .set_msglevel = ixgb_set_msglevel,
.set_tso = ixgb_set_tso,
.get_strings = ixgb_get_strings, .get_strings = ixgb_get_strings,
.set_phys_id = ixgb_set_phys_id, .set_phys_id = ixgb_set_phys_id,
.get_sset_count = ixgb_get_sset_count, .get_sset_count = ixgb_get_sset_count,
......
...@@ -325,6 +325,28 @@ ixgb_reset(struct ixgb_adapter *adapter) ...@@ -325,6 +325,28 @@ ixgb_reset(struct ixgb_adapter *adapter)
} }
} }
static int
ixgb_set_features(struct net_device *netdev, u32 features)
{
struct ixgb_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)) {
ixgb_down(adapter, true);
ixgb_up(adapter);
ixgb_set_speed_duplex(netdev);
} else
ixgb_reset(adapter);
return 0;
}
static const struct net_device_ops ixgb_netdev_ops = { static const struct net_device_ops ixgb_netdev_ops = {
.ndo_open = ixgb_open, .ndo_open = ixgb_open,
.ndo_stop = ixgb_close, .ndo_stop = ixgb_close,
...@@ -340,6 +362,7 @@ static const struct net_device_ops ixgb_netdev_ops = { ...@@ -340,6 +362,7 @@ static const struct net_device_ops ixgb_netdev_ops = {
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = ixgb_netpoll, .ndo_poll_controller = ixgb_netpoll,
#endif #endif
.ndo_set_features = ixgb_set_features,
}; };
/** /**
...@@ -439,12 +462,14 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -439,12 +462,14 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (err) if (err)
goto err_sw_init; goto err_sw_init;
netdev->features = NETIF_F_SG | netdev->hw_features = NETIF_F_SG |
NETIF_F_HW_CSUM | NETIF_F_TSO |
NETIF_F_HW_CSUM;
netdev->features = netdev->hw_features |
NETIF_F_HW_VLAN_TX | 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;
netdev->features |= NETIF_F_TSO; 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