Commit 9000edb7 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

net: ethtool: require drivers to set supported_coalesce_params

Now that all in-tree drivers have been updated we can
make the supported_coalesce_params mandatory.

To save debugging time in case some driver was missed
(or is out of tree) add a warning when netdev is registered
with set_coalesce but without supported_coalesce_params.
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarMichal Kubecek <mkubecek@suse.cz>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 329bab6e
...@@ -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