net: provide a default dev->ethtool_ops
Instead of forcing device drivers to provide empty ethtool_ops or tweak net/core/ethtool.c again, we could provide a generic ethtool_ops. This occurred to me when I wanted to add GSO support to GRE tunnels. ethtool -k support should be generic for all drivers. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Ben Hutchings <bhutchings@solarflare.com> Cc: Maciej Żenczykowski <maze@google.com> Reviewed-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
828de4f6bf
commit
2c60db0370
@ -5974,6 +5974,8 @@ struct netdev_queue *dev_ingress_queue_create(struct net_device *dev)
|
|||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct ethtool_ops default_ethtool_ops;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* alloc_netdev_mqs - allocate network device
|
* alloc_netdev_mqs - allocate network device
|
||||||
* @sizeof_priv: size of private data to allocate space for
|
* @sizeof_priv: size of private data to allocate space for
|
||||||
@ -6061,6 +6063,8 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
|
|||||||
|
|
||||||
strcpy(dev->name, name);
|
strcpy(dev->name, name);
|
||||||
dev->group = INIT_NETDEV_GROUP;
|
dev->group = INIT_NETDEV_GROUP;
|
||||||
|
if (!dev->ethtool_ops)
|
||||||
|
dev->ethtool_ops = &default_ethtool_ops;
|
||||||
return dev;
|
return dev;
|
||||||
|
|
||||||
free_all:
|
free_all:
|
||||||
|
@ -1426,18 +1426,6 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
|
|||||||
if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
|
if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (!dev->ethtool_ops) {
|
|
||||||
/* A few commands do not require any driver support,
|
|
||||||
* are unprivileged, and do not change anything, so we
|
|
||||||
* can take a shortcut to them. */
|
|
||||||
if (ethcmd == ETHTOOL_GDRVINFO)
|
|
||||||
return ethtool_get_drvinfo(dev, useraddr);
|
|
||||||
else if (ethcmd == ETHTOOL_GET_TS_INFO)
|
|
||||||
return ethtool_get_ts_info(dev, useraddr);
|
|
||||||
else
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allow some commands to be done by anyone */
|
/* Allow some commands to be done by anyone */
|
||||||
switch (ethcmd) {
|
switch (ethcmd) {
|
||||||
case ETHTOOL_GSET:
|
case ETHTOOL_GSET:
|
||||||
|
Loading…
Reference in New Issue
Block a user