Commit dc221294 authored by Bruce Allan's avatar Bruce Allan Committed by Jeff Kirsher

e1000e: convert to netdev features/hw_features API

Private rx_csum flags are now duplicate of netdev->features &
NETIF_F_RXCSUM.  Remove those duplicates and use the net_device_ops
ndo_set_features.  This is based on the original patch submitted by
Michał Mirosław <mirq-linux@rere.qmqm.pl>

Cc: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 3cd0999d
...@@ -1498,7 +1498,6 @@ struct e1000_info e1000_es2_info = { ...@@ -1498,7 +1498,6 @@ struct e1000_info e1000_es2_info = {
| FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_JUMBO_FRAMES
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_APME_IN_CTRL3 | FLAG_APME_IN_CTRL3
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_CTRLEXT_ON_LOAD
| FLAG_RX_NEEDS_RESTART /* errata */ | FLAG_RX_NEEDS_RESTART /* errata */
| FLAG_TARC_SET_BIT_ZERO /* errata */ | FLAG_TARC_SET_BIT_ZERO /* errata */
......
...@@ -2019,7 +2019,6 @@ struct e1000_info e1000_82571_info = { ...@@ -2019,7 +2019,6 @@ struct e1000_info e1000_82571_info = {
| FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_JUMBO_FRAMES
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_APME_IN_CTRL3 | FLAG_APME_IN_CTRL3
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_CTRLEXT_ON_LOAD
| FLAG_HAS_SMART_POWER_DOWN | FLAG_HAS_SMART_POWER_DOWN
| FLAG_RESET_OVERWRITES_LAA /* errata */ | FLAG_RESET_OVERWRITES_LAA /* errata */
...@@ -2041,7 +2040,6 @@ struct e1000_info e1000_82572_info = { ...@@ -2041,7 +2040,6 @@ struct e1000_info e1000_82572_info = {
| FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_JUMBO_FRAMES
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_APME_IN_CTRL3 | FLAG_APME_IN_CTRL3
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_CTRLEXT_ON_LOAD
| FLAG_TARC_SPEED_MODE_BIT, /* errata */ | FLAG_TARC_SPEED_MODE_BIT, /* errata */
.flags2 = FLAG2_DISABLE_ASPM_L1 /* errata 13 */ .flags2 = FLAG2_DISABLE_ASPM_L1 /* errata 13 */
...@@ -2059,7 +2057,6 @@ struct e1000_info e1000_82573_info = { ...@@ -2059,7 +2057,6 @@ struct e1000_info e1000_82573_info = {
.flags = FLAG_HAS_HW_VLAN_FILTER .flags = FLAG_HAS_HW_VLAN_FILTER
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_APME_IN_CTRL3 | FLAG_APME_IN_CTRL3
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_SMART_POWER_DOWN | FLAG_HAS_SMART_POWER_DOWN
| FLAG_HAS_AMT | FLAG_HAS_AMT
| FLAG_HAS_SWSM_ON_LOAD, | FLAG_HAS_SWSM_ON_LOAD,
...@@ -2080,7 +2077,6 @@ struct e1000_info e1000_82574_info = { ...@@ -2080,7 +2077,6 @@ struct e1000_info e1000_82574_info = {
| FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_JUMBO_FRAMES
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_APME_IN_CTRL3 | FLAG_APME_IN_CTRL3
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_SMART_POWER_DOWN | FLAG_HAS_SMART_POWER_DOWN
| FLAG_HAS_AMT | FLAG_HAS_AMT
| FLAG_HAS_CTRLEXT_ON_LOAD, | FLAG_HAS_CTRLEXT_ON_LOAD,
...@@ -2100,7 +2096,6 @@ struct e1000_info e1000_82583_info = { ...@@ -2100,7 +2096,6 @@ struct e1000_info e1000_82583_info = {
.flags = FLAG_HAS_HW_VLAN_FILTER .flags = FLAG_HAS_HW_VLAN_FILTER
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_APME_IN_CTRL3 | FLAG_APME_IN_CTRL3
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_SMART_POWER_DOWN | FLAG_HAS_SMART_POWER_DOWN
| FLAG_HAS_AMT | FLAG_HAS_AMT
| FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_JUMBO_FRAMES
......
...@@ -440,12 +440,11 @@ struct e1000_info { ...@@ -440,12 +440,11 @@ struct e1000_info {
#define FLAG_LSC_GIG_SPEED_DROP (1 << 25) #define FLAG_LSC_GIG_SPEED_DROP (1 << 25)
#define FLAG_SMART_POWER_DOWN (1 << 26) #define FLAG_SMART_POWER_DOWN (1 << 26)
#define FLAG_MSI_ENABLED (1 << 27) #define FLAG_MSI_ENABLED (1 << 27)
#define FLAG_RX_CSUM_ENABLED (1 << 28) /* reserved (1 << 28) */
#define FLAG_TSO_FORCE (1 << 29) #define FLAG_TSO_FORCE (1 << 29)
#define FLAG_RX_RESTART_NOW (1 << 30) #define FLAG_RX_RESTART_NOW (1 << 30)
#define FLAG_MSI_TEST_FAILED (1 << 31) #define FLAG_MSI_TEST_FAILED (1 << 31)
/* CRC Stripping defines */
#define FLAG2_CRC_STRIPPING (1 << 0) #define FLAG2_CRC_STRIPPING (1 << 0)
#define FLAG2_HAS_PHY_WAKEUP (1 << 1) #define FLAG2_HAS_PHY_WAKEUP (1 << 1)
#define FLAG2_IS_DISCARDING (1 << 2) #define FLAG2_IS_DISCARDING (1 << 2)
......
...@@ -367,59 +367,6 @@ static int e1000_set_pauseparam(struct net_device *netdev, ...@@ -367,59 +367,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->flags & FLAG_RX_CSUM_ENABLED;
}
static int e1000_set_rx_csum(struct net_device *netdev, u32 data)
{
struct e1000_adapter *adapter = netdev_priv(netdev);
if (data)
adapter->flags |= FLAG_RX_CSUM_ENABLED;
else
adapter->flags &= ~FLAG_RX_CSUM_ENABLED;
if (netif_running(netdev))
e1000e_reinit_locked(adapter);
else
e1000e_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)
{
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);
if (data) {
netdev->features |= NETIF_F_TSO;
netdev->features |= NETIF_F_TSO6;
} else {
netdev->features &= ~NETIF_F_TSO;
netdev->features &= ~NETIF_F_TSO6;
}
adapter->flags |= FLAG_TSO_FORCE;
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);
...@@ -2014,31 +1961,6 @@ static void e1000_get_strings(struct net_device *netdev, u32 stringset, ...@@ -2014,31 +1961,6 @@ static void e1000_get_strings(struct net_device *netdev, u32 stringset,
} }
} }
static int e1000e_set_flags(struct net_device *netdev, u32 data)
{
struct e1000_adapter *adapter = netdev_priv(netdev);
bool need_reset = false;
int rc;
need_reset = (data & ETH_FLAG_RXVLAN) !=
(netdev->features & NETIF_F_HW_VLAN_RX);
rc = ethtool_op_set_flags(netdev, data, ETH_FLAG_RXVLAN |
ETH_FLAG_TXVLAN);
if (rc)
return rc;
if (need_reset) {
if (netif_running(netdev))
e1000e_reinit_locked(adapter);
else
e1000e_reset(adapter);
}
return 0;
}
static const struct ethtool_ops e1000_ethtool_ops = { static const struct ethtool_ops e1000_ethtool_ops = {
.get_settings = e1000_get_settings, .get_settings = e1000_get_settings,
.set_settings = e1000_set_settings, .set_settings = e1000_set_settings,
...@@ -2058,14 +1980,6 @@ static const struct ethtool_ops e1000_ethtool_ops = { ...@@ -2058,14 +1980,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,
.get_sg = ethtool_op_get_sg,
.set_sg = ethtool_op_set_sg,
.get_tso = ethtool_op_get_tso,
.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,
...@@ -2073,8 +1987,6 @@ static const struct ethtool_ops e1000_ethtool_ops = { ...@@ -2073,8 +1987,6 @@ static const struct ethtool_ops e1000_ethtool_ops = {
.get_sset_count = e1000e_get_sset_count, .get_sset_count = e1000e_get_sset_count,
.get_coalesce = e1000_get_coalesce, .get_coalesce = e1000_get_coalesce,
.set_coalesce = e1000_set_coalesce, .set_coalesce = e1000_set_coalesce,
.get_flags = ethtool_op_get_flags,
.set_flags = e1000e_set_flags,
}; };
void e1000e_set_ethtool_ops(struct net_device *netdev) void e1000e_set_ethtool_ops(struct net_device *netdev)
......
...@@ -4058,7 +4058,6 @@ struct e1000_info e1000_ich8_info = { ...@@ -4058,7 +4058,6 @@ struct e1000_info e1000_ich8_info = {
.mac = e1000_ich8lan, .mac = e1000_ich8lan,
.flags = FLAG_HAS_WOL .flags = FLAG_HAS_WOL
| FLAG_IS_ICH | FLAG_IS_ICH
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_CTRLEXT_ON_LOAD
| FLAG_HAS_AMT | FLAG_HAS_AMT
| FLAG_HAS_FLASH | FLAG_HAS_FLASH
...@@ -4076,7 +4075,6 @@ struct e1000_info e1000_ich9_info = { ...@@ -4076,7 +4075,6 @@ struct e1000_info e1000_ich9_info = {
.flags = FLAG_HAS_JUMBO_FRAMES .flags = FLAG_HAS_JUMBO_FRAMES
| FLAG_IS_ICH | FLAG_IS_ICH
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_CTRLEXT_ON_LOAD
| FLAG_HAS_AMT | FLAG_HAS_AMT
| FLAG_HAS_ERT | FLAG_HAS_ERT
...@@ -4095,7 +4093,6 @@ struct e1000_info e1000_ich10_info = { ...@@ -4095,7 +4093,6 @@ struct e1000_info e1000_ich10_info = {
.flags = FLAG_HAS_JUMBO_FRAMES .flags = FLAG_HAS_JUMBO_FRAMES
| FLAG_IS_ICH | FLAG_IS_ICH
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_CTRLEXT_ON_LOAD
| FLAG_HAS_AMT | FLAG_HAS_AMT
| FLAG_HAS_ERT | FLAG_HAS_ERT
...@@ -4113,7 +4110,6 @@ struct e1000_info e1000_pch_info = { ...@@ -4113,7 +4110,6 @@ struct e1000_info e1000_pch_info = {
.mac = e1000_pchlan, .mac = e1000_pchlan,
.flags = FLAG_IS_ICH .flags = FLAG_IS_ICH
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_CTRLEXT_ON_LOAD
| FLAG_HAS_AMT | FLAG_HAS_AMT
| FLAG_HAS_FLASH | FLAG_HAS_FLASH
...@@ -4133,7 +4129,6 @@ struct e1000_info e1000_pch2_info = { ...@@ -4133,7 +4129,6 @@ struct e1000_info e1000_pch2_info = {
.mac = e1000_pch2lan, .mac = e1000_pch2lan,
.flags = FLAG_IS_ICH .flags = FLAG_IS_ICH
| FLAG_HAS_WOL | FLAG_HAS_WOL
| FLAG_RX_CSUM_ENABLED
| FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_CTRLEXT_ON_LOAD
| FLAG_HAS_AMT | FLAG_HAS_AMT
| FLAG_HAS_FLASH | FLAG_HAS_FLASH
......
...@@ -3069,7 +3069,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) ...@@ -3069,7 +3069,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
/* Enable Receive Checksum Offload for TCP and UDP */ /* Enable Receive Checksum Offload for TCP and UDP */
rxcsum = er32(RXCSUM); rxcsum = er32(RXCSUM);
if (adapter->flags & FLAG_RX_CSUM_ENABLED) { if (adapter->netdev->features & NETIF_F_RXCSUM) {
rxcsum |= E1000_RXCSUM_TUOFL; rxcsum |= E1000_RXCSUM_TUOFL;
/* /*
...@@ -5860,6 +5860,26 @@ static void e1000_eeprom_checks(struct e1000_adapter *adapter) ...@@ -5860,6 +5860,26 @@ static void e1000_eeprom_checks(struct e1000_adapter *adapter)
} }
} }
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_TSO | NETIF_F_TSO6))
adapter->flags |= FLAG_TSO_FORCE;
if (!(changed & (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX |
NETIF_F_RXCSUM)))
return 0;
if (netif_running(netdev))
e1000e_reinit_locked(adapter);
else
e1000e_reset(adapter);
return 0;
}
static const struct net_device_ops e1000e_netdev_ops = { static const struct net_device_ops e1000e_netdev_ops = {
.ndo_open = e1000_open, .ndo_open = e1000_open,
.ndo_stop = e1000_close, .ndo_stop = e1000_close,
...@@ -5877,6 +5897,7 @@ static const struct net_device_ops e1000e_netdev_ops = { ...@@ -5877,6 +5897,7 @@ static const struct net_device_ops e1000e_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,
}; };
/** /**
...@@ -6036,21 +6057,25 @@ static int __devinit e1000_probe(struct pci_dev *pdev, ...@@ -6036,21 +6057,25 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
if (e1000_check_reset_block(&adapter->hw)) if (e1000_check_reset_block(&adapter->hw))
e_info("PHY reset is blocked due to SOL/IDER session.\n"); e_info("PHY reset is blocked due to SOL/IDER session.\n");
netdev->features = NETIF_F_SG | /* Set initial default active device features */
NETIF_F_HW_CSUM | netdev->features = (NETIF_F_SG |
NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX |
NETIF_F_HW_VLAN_RX; NETIF_F_HW_VLAN_TX |
NETIF_F_TSO |
NETIF_F_TSO6 |
NETIF_F_RXCSUM |
NETIF_F_HW_CSUM);
/* Set user-changeable features (subset of all device features) */
netdev->hw_features = netdev->features;
if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
netdev->features |= NETIF_F_HW_VLAN_FILTER; netdev->features |= NETIF_F_HW_VLAN_FILTER;
netdev->features |= NETIF_F_TSO; netdev->vlan_features |= (NETIF_F_SG |
netdev->features |= NETIF_F_TSO6; NETIF_F_TSO |
NETIF_F_TSO6 |
netdev->vlan_features |= NETIF_F_TSO; NETIF_F_HW_CSUM);
netdev->vlan_features |= NETIF_F_TSO6;
netdev->vlan_features |= NETIF_F_HW_CSUM;
netdev->vlan_features |= NETIF_F_SG;
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