Commit 225fc223 authored by David S. Miller's avatar David S. Miller

Merge branch 'ethtool-consolidate-irq-coalescing-last-part'

Jakub Kicinski says:

====================
ethtool: consolidate irq coalescing - last part

Convert remaining drivers following the groundwork laid in a recent
patch set [1] and continued in [2], [3], [4], [5]. The aim of
the effort is to consolidate irq coalescing parameter validation
in the core.

This set is the sixth and last installment. It converts the remaining
8 drivers in drivers/net/ethernet. The last patch makes declaring
supported IRQ coalescing parameters a requirement.

[1] https://lore.kernel.org/netdev/20200305051542.991898-1-kuba@kernel.org/
[2] https://lore.kernel.org/netdev/20200306010602.1620354-1-kuba@kernel.org/
[3] https://lore.kernel.org/netdev/20200310021512.1861626-1-kuba@kernel.org/
[4] https://lore.kernel.org/netdev/20200311223302.2171564-1-kuba@kernel.org/
[5] https://lore.kernel.org/netdev/20200313040803.2367590-1-kuba@kernel.org/
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 01a6a62e 9000edb7
...@@ -232,9 +232,6 @@ static int efx_ethtool_set_coalesce(struct net_device *net_dev, ...@@ -232,9 +232,6 @@ static int efx_ethtool_set_coalesce(struct net_device *net_dev,
bool adaptive, rx_may_override_tx; bool adaptive, rx_may_override_tx;
int rc; int rc;
if (coalesce->use_adaptive_tx_coalesce)
return -EINVAL;
efx_get_irq_moderation(efx, &tx_usecs, &rx_usecs, &adaptive); efx_get_irq_moderation(efx, &tx_usecs, &rx_usecs, &adaptive);
if (coalesce->rx_coalesce_usecs != rx_usecs) if (coalesce->rx_coalesce_usecs != rx_usecs)
...@@ -1138,6 +1135,9 @@ static int efx_ethtool_set_fecparam(struct net_device *net_dev, ...@@ -1138,6 +1135,9 @@ static int efx_ethtool_set_fecparam(struct net_device *net_dev,
} }
const struct ethtool_ops efx_ethtool_ops = { const struct ethtool_ops efx_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
ETHTOOL_COALESCE_USECS_IRQ |
ETHTOOL_COALESCE_USE_ADAPTIVE_RX,
.get_drvinfo = efx_ethtool_get_drvinfo, .get_drvinfo = efx_ethtool_get_drvinfo,
.get_regs_len = efx_ethtool_get_regs_len, .get_regs_len = efx_ethtool_get_regs_len,
.get_regs = efx_ethtool_get_regs, .get_regs = efx_ethtool_get_regs,
......
...@@ -603,9 +603,6 @@ static int ef4_ethtool_set_coalesce(struct net_device *net_dev, ...@@ -603,9 +603,6 @@ static int ef4_ethtool_set_coalesce(struct net_device *net_dev,
bool adaptive, rx_may_override_tx; bool adaptive, rx_may_override_tx;
int rc; int rc;
if (coalesce->use_adaptive_tx_coalesce)
return -EINVAL;
ef4_get_irq_moderation(efx, &tx_usecs, &rx_usecs, &adaptive); ef4_get_irq_moderation(efx, &tx_usecs, &rx_usecs, &adaptive);
if (coalesce->rx_coalesce_usecs != rx_usecs) if (coalesce->rx_coalesce_usecs != rx_usecs)
...@@ -1311,6 +1308,9 @@ static int ef4_ethtool_get_module_info(struct net_device *net_dev, ...@@ -1311,6 +1308,9 @@ static int ef4_ethtool_get_module_info(struct net_device *net_dev,
} }
const struct ethtool_ops ef4_ethtool_ops = { const struct ethtool_ops ef4_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
ETHTOOL_COALESCE_USECS_IRQ |
ETHTOOL_COALESCE_USE_ADAPTIVE_RX,
.get_drvinfo = ef4_ethtool_get_drvinfo, .get_drvinfo = ef4_ethtool_get_drvinfo,
.get_regs_len = ef4_ethtool_get_regs_len, .get_regs_len = ef4_ethtool_get_regs_len,
.get_regs = ef4_ethtool_get_regs, .get_regs = ef4_ethtool_get_regs,
......
...@@ -589,6 +589,8 @@ static void netsec_et_set_msglevel(struct net_device *dev, u32 datum) ...@@ -589,6 +589,8 @@ static void netsec_et_set_msglevel(struct net_device *dev, u32 datum)
} }
static const struct ethtool_ops netsec_ethtool_ops = { static const struct ethtool_ops netsec_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
ETHTOOL_COALESCE_MAX_FRAMES,
.get_drvinfo = netsec_et_get_drvinfo, .get_drvinfo = netsec_et_get_drvinfo,
.get_link_ksettings = phy_ethtool_get_link_ksettings, .get_link_ksettings = phy_ethtool_get_link_ksettings,
.set_link_ksettings = phy_ethtool_set_link_ksettings, .set_link_ksettings = phy_ethtool_set_link_ksettings,
......
...@@ -151,7 +151,6 @@ static int xlgmac_ethtool_get_coalesce(struct net_device *netdev, ...@@ -151,7 +151,6 @@ static int xlgmac_ethtool_get_coalesce(struct net_device *netdev,
{ {
struct xlgmac_pdata *pdata = netdev_priv(netdev); struct xlgmac_pdata *pdata = netdev_priv(netdev);
memset(ec, 0, sizeof(struct ethtool_coalesce));
ec->rx_coalesce_usecs = pdata->rx_usecs; ec->rx_coalesce_usecs = pdata->rx_usecs;
ec->rx_max_coalesced_frames = pdata->rx_frames; ec->rx_max_coalesced_frames = pdata->rx_frames;
ec->tx_max_coalesced_frames = pdata->tx_frames; ec->tx_max_coalesced_frames = pdata->tx_frames;
...@@ -167,20 +166,6 @@ static int xlgmac_ethtool_set_coalesce(struct net_device *netdev, ...@@ -167,20 +166,6 @@ static int xlgmac_ethtool_set_coalesce(struct net_device *netdev,
unsigned int rx_frames, rx_riwt, rx_usecs; unsigned int rx_frames, rx_riwt, rx_usecs;
unsigned int tx_frames; unsigned int tx_frames;
/* Check for not supported parameters */
if ((ec->rx_coalesce_usecs_irq) || (ec->rx_max_coalesced_frames_irq) ||
(ec->tx_coalesce_usecs) || (ec->tx_coalesce_usecs_high) ||
(ec->tx_max_coalesced_frames_irq) || (ec->tx_coalesce_usecs_irq) ||
(ec->stats_block_coalesce_usecs) || (ec->pkt_rate_low) ||
(ec->use_adaptive_rx_coalesce) || (ec->use_adaptive_tx_coalesce) ||
(ec->rx_max_coalesced_frames_low) || (ec->rx_coalesce_usecs_low) ||
(ec->tx_coalesce_usecs_low) || (ec->tx_max_coalesced_frames_low) ||
(ec->pkt_rate_high) || (ec->rx_coalesce_usecs_high) ||
(ec->rx_max_coalesced_frames_high) ||
(ec->tx_max_coalesced_frames_high) ||
(ec->rate_sample_interval))
return -EOPNOTSUPP;
rx_usecs = ec->rx_coalesce_usecs; rx_usecs = ec->rx_coalesce_usecs;
rx_riwt = hw_ops->usec_to_riwt(pdata, rx_usecs); rx_riwt = hw_ops->usec_to_riwt(pdata, rx_usecs);
rx_frames = ec->rx_max_coalesced_frames; rx_frames = ec->rx_max_coalesced_frames;
...@@ -257,6 +242,8 @@ static void xlgmac_ethtool_get_ethtool_stats(struct net_device *netdev, ...@@ -257,6 +242,8 @@ static void xlgmac_ethtool_get_ethtool_stats(struct net_device *netdev,
} }
static const struct ethtool_ops xlgmac_ethtool_ops = { static const struct ethtool_ops xlgmac_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS |
ETHTOOL_COALESCE_MAX_FRAMES,
.get_drvinfo = xlgmac_ethtool_get_drvinfo, .get_drvinfo = xlgmac_ethtool_get_drvinfo,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.get_msglevel = xlgmac_ethtool_get_msglevel, .get_msglevel = xlgmac_ethtool_get_msglevel,
......
...@@ -2373,6 +2373,8 @@ static void bdx_get_ethtool_stats(struct net_device *netdev, ...@@ -2373,6 +2373,8 @@ static void bdx_get_ethtool_stats(struct net_device *netdev,
static void bdx_set_ethtool_ops(struct net_device *netdev) static void bdx_set_ethtool_ops(struct net_device *netdev)
{ {
static const struct ethtool_ops bdx_ethtool_ops = { static const struct ethtool_ops bdx_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
ETHTOOL_COALESCE_MAX_FRAMES,
.get_drvinfo = bdx_get_drvinfo, .get_drvinfo = bdx_get_drvinfo,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.get_coalesce = bdx_get_coalesce, .get_coalesce = bdx_get_coalesce,
......
...@@ -1211,6 +1211,7 @@ static int cpsw_set_channels(struct net_device *ndev, ...@@ -1211,6 +1211,7 @@ static int cpsw_set_channels(struct net_device *ndev,
} }
static const struct ethtool_ops cpsw_ethtool_ops = { static const struct ethtool_ops cpsw_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS,
.get_drvinfo = cpsw_get_drvinfo, .get_drvinfo = cpsw_get_drvinfo,
.get_msglevel = cpsw_get_msglevel, .get_msglevel = cpsw_get_msglevel,
.set_msglevel = cpsw_set_msglevel, .set_msglevel = cpsw_set_msglevel,
......
...@@ -1175,6 +1175,7 @@ static int cpsw_set_channels(struct net_device *ndev, ...@@ -1175,6 +1175,7 @@ static int cpsw_set_channels(struct net_device *ndev,
} }
static const struct ethtool_ops cpsw_ethtool_ops = { static const struct ethtool_ops cpsw_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS,
.get_drvinfo = cpsw_get_drvinfo, .get_drvinfo = cpsw_get_drvinfo,
.get_msglevel = cpsw_get_msglevel, .get_msglevel = cpsw_get_msglevel,
.set_msglevel = cpsw_set_msglevel, .set_msglevel = cpsw_set_msglevel,
......
...@@ -481,6 +481,7 @@ static int emac_set_coalesce(struct net_device *ndev, ...@@ -481,6 +481,7 @@ static int emac_set_coalesce(struct net_device *ndev,
* Ethtool support for EMAC adapter * Ethtool support for EMAC adapter
*/ */
static const struct ethtool_ops ethtool_ops = { static const struct ethtool_ops ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS,
.get_drvinfo = emac_get_drvinfo, .get_drvinfo = emac_get_drvinfo,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.get_coalesce = emac_get_coalesce, .get_coalesce = emac_get_coalesce,
......
...@@ -1314,25 +1314,6 @@ static int ll_temac_ethtools_set_coalesce(struct net_device *ndev, ...@@ -1314,25 +1314,6 @@ static int ll_temac_ethtools_set_coalesce(struct net_device *ndev,
return -EFAULT; return -EFAULT;
} }
if (ec->rx_coalesce_usecs_irq ||
ec->rx_max_coalesced_frames_irq ||
ec->tx_coalesce_usecs_irq ||
ec->tx_max_coalesced_frames_irq ||
ec->stats_block_coalesce_usecs ||
ec->use_adaptive_rx_coalesce ||
ec->use_adaptive_tx_coalesce ||
ec->pkt_rate_low ||
ec->rx_coalesce_usecs_low ||
ec->rx_max_coalesced_frames_low ||
ec->tx_coalesce_usecs_low ||
ec->tx_max_coalesced_frames_low ||
ec->pkt_rate_high ||
ec->rx_coalesce_usecs_high ||
ec->rx_max_coalesced_frames_high ||
ec->tx_coalesce_usecs_high ||
ec->tx_max_coalesced_frames_high ||
ec->rate_sample_interval)
return -EOPNOTSUPP;
if (ec->rx_max_coalesced_frames) if (ec->rx_max_coalesced_frames)
lp->coalesce_count_rx = ec->rx_max_coalesced_frames; lp->coalesce_count_rx = ec->rx_max_coalesced_frames;
if (ec->tx_max_coalesced_frames) if (ec->tx_max_coalesced_frames)
...@@ -1351,6 +1332,8 @@ static int ll_temac_ethtools_set_coalesce(struct net_device *ndev, ...@@ -1351,6 +1332,8 @@ static int ll_temac_ethtools_set_coalesce(struct net_device *ndev,
} }
static const struct ethtool_ops temac_ethtool_ops = { static const struct ethtool_ops temac_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
ETHTOOL_COALESCE_MAX_FRAMES,
.nway_reset = phy_ethtool_nway_reset, .nway_reset = phy_ethtool_nway_reset,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.get_ts_info = ethtool_op_get_ts_info, .get_ts_info = ethtool_op_get_ts_info,
......
...@@ -1309,27 +1309,6 @@ static int axienet_ethtools_set_coalesce(struct net_device *ndev, ...@@ -1309,27 +1309,6 @@ static int axienet_ethtools_set_coalesce(struct net_device *ndev,
return -EFAULT; return -EFAULT;
} }
if ((ecoalesce->rx_coalesce_usecs) ||
(ecoalesce->rx_coalesce_usecs_irq) ||
(ecoalesce->rx_max_coalesced_frames_irq) ||
(ecoalesce->tx_coalesce_usecs) ||
(ecoalesce->tx_coalesce_usecs_irq) ||
(ecoalesce->tx_max_coalesced_frames_irq) ||
(ecoalesce->stats_block_coalesce_usecs) ||
(ecoalesce->use_adaptive_rx_coalesce) ||
(ecoalesce->use_adaptive_tx_coalesce) ||
(ecoalesce->pkt_rate_low) ||
(ecoalesce->rx_coalesce_usecs_low) ||
(ecoalesce->rx_max_coalesced_frames_low) ||
(ecoalesce->tx_coalesce_usecs_low) ||
(ecoalesce->tx_max_coalesced_frames_low) ||
(ecoalesce->pkt_rate_high) ||
(ecoalesce->rx_coalesce_usecs_high) ||
(ecoalesce->rx_max_coalesced_frames_high) ||
(ecoalesce->tx_coalesce_usecs_high) ||
(ecoalesce->tx_max_coalesced_frames_high) ||
(ecoalesce->rate_sample_interval))
return -EOPNOTSUPP;
if (ecoalesce->rx_max_coalesced_frames) if (ecoalesce->rx_max_coalesced_frames)
lp->coalesce_count_rx = ecoalesce->rx_max_coalesced_frames; lp->coalesce_count_rx = ecoalesce->rx_max_coalesced_frames;
if (ecoalesce->tx_max_coalesced_frames) if (ecoalesce->tx_max_coalesced_frames)
...@@ -1357,6 +1336,7 @@ axienet_ethtools_set_link_ksettings(struct net_device *ndev, ...@@ -1357,6 +1336,7 @@ axienet_ethtools_set_link_ksettings(struct net_device *ndev,
} }
static const struct ethtool_ops axienet_ethtool_ops = { static const struct ethtool_ops axienet_ethtool_ops = {
.supported_coalesce_params = ETHTOOL_COALESCE_MAX_FRAMES,
.get_drvinfo = axienet_ethtools_get_drvinfo, .get_drvinfo = axienet_ethtools_get_drvinfo,
.get_regs_len = axienet_ethtools_get_regs_len, .get_regs_len = axienet_ethtools_get_regs_len,
.get_regs = axienet_ethtools_get_regs, .get_regs = axienet_ethtools_get_regs,
......
...@@ -458,6 +458,8 @@ struct ethtool_ops { ...@@ -458,6 +458,8 @@ struct ethtool_ops {
struct ethtool_stats *, u64 *); struct ethtool_stats *, u64 *);
}; };
int ethtool_check_ops(const struct ethtool_ops *ops);
struct ethtool_rx_flow_rule { struct ethtool_rx_flow_rule {
struct flow_rule *rule; struct flow_rule *rule;
unsigned long priv[0]; unsigned long priv[0];
......
...@@ -9283,6 +9283,10 @@ int register_netdevice(struct net_device *dev) ...@@ -9283,6 +9283,10 @@ int register_netdevice(struct net_device *dev)
BUG_ON(dev->reg_state != NETREG_UNINITIALIZED); BUG_ON(dev->reg_state != NETREG_UNINITIALIZED);
BUG_ON(!net); BUG_ON(!net);
ret = ethtool_check_ops(dev->ethtool_ops);
if (ret)
return ret;
spin_lock_init(&dev->addr_list_lock); spin_lock_init(&dev->addr_list_lock);
lockdep_set_class(&dev->addr_list_lock, &dev->addr_list_lock_key); lockdep_set_class(&dev->addr_list_lock, &dev->addr_list_lock_key);
......
...@@ -289,3 +289,14 @@ int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max) ...@@ -289,3 +289,14 @@ int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max)
kfree(indir); kfree(indir);
return ret; return ret;
} }
int ethtool_check_ops(const struct ethtool_ops *ops)
{
if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
return -EINVAL;
/* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
* the fact that ops are checked at registration time does not
* mean the ops attached to a netdev later on are sane.
*/
return 0;
}
...@@ -1519,9 +1519,6 @@ ethtool_set_coalesce_supported(struct net_device *dev, ...@@ -1519,9 +1519,6 @@ ethtool_set_coalesce_supported(struct net_device *dev,
u32 supported_params = dev->ethtool_ops->supported_coalesce_params; u32 supported_params = dev->ethtool_ops->supported_coalesce_params;
u32 nonzero_params = 0; u32 nonzero_params = 0;
if (!supported_params)
return true;
if (coalesce->rx_coalesce_usecs) if (coalesce->rx_coalesce_usecs)
nonzero_params |= ETHTOOL_COALESCE_RX_USECS; nonzero_params |= ETHTOOL_COALESCE_RX_USECS;
if (coalesce->rx_max_coalesced_frames) if (coalesce->rx_max_coalesced_frames)
......
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