mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
net: promote SIOCSHWTSTAMP and SIOCGHWTSTAMP ioctls to dedicated handlers
DSA does not want to intercept all ioctls handled by dev_eth_ioctl(),
only SIOCSHWTSTAMP. This can be seen from commit f685e609a3 ("net:
dsa: Deny PTP on master if switch supports it"). However, the way in
which the dsa_ndo_eth_ioctl() is called would suggest otherwise.
Split the handling of SIOCSHWTSTAMP and SIOCGHWTSTAMP ioctls into
separate case statements of dev_ifsioc(), and make each one call its own
sub-function. This also removes the dsa_ndo_eth_ioctl() call from
dev_eth_ioctl(), which from now on exclusively handles PHY ioctls.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1193db2a55
commit
4ee58e1e56
|
|
@ -246,20 +246,34 @@ static int dev_eth_ioctl(struct net_device *dev,
|
||||||
struct ifreq *ifr, unsigned int cmd)
|
struct ifreq *ifr, unsigned int cmd)
|
||||||
{
|
{
|
||||||
const struct net_device_ops *ops = dev->netdev_ops;
|
const struct net_device_ops *ops = dev->netdev_ops;
|
||||||
|
|
||||||
|
if (!ops->ndo_eth_ioctl)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
if (!netif_device_present(dev))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
return ops->ndo_eth_ioctl(dev, ifr, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dev_get_hwtstamp(struct net_device *dev, struct ifreq *ifr)
|
||||||
|
{
|
||||||
|
return dev_eth_ioctl(dev, ifr, SIOCGHWTSTAMP);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dev_set_hwtstamp(struct net_device *dev, struct ifreq *ifr)
|
||||||
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = dsa_ndo_eth_ioctl(dev, ifr, cmd);
|
err = net_hwtstamp_validate(ifr);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
err = dsa_ndo_eth_ioctl(dev, ifr, SIOCSHWTSTAMP);
|
||||||
if (err != -EOPNOTSUPP)
|
if (err != -EOPNOTSUPP)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (ops->ndo_eth_ioctl) {
|
return dev_eth_ioctl(dev, ifr, SIOCSHWTSTAMP);
|
||||||
if (netif_device_present(dev))
|
|
||||||
err = ops->ndo_eth_ioctl(dev, ifr, cmd);
|
|
||||||
else
|
|
||||||
err = -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dev_siocbond(struct net_device *dev,
|
static int dev_siocbond(struct net_device *dev,
|
||||||
|
|
@ -395,12 +409,11 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data,
|
||||||
return dev_siocdevprivate(dev, ifr, data, cmd);
|
return dev_siocdevprivate(dev, ifr, data, cmd);
|
||||||
|
|
||||||
case SIOCSHWTSTAMP:
|
case SIOCSHWTSTAMP:
|
||||||
err = net_hwtstamp_validate(ifr);
|
return dev_set_hwtstamp(dev, ifr);
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
fallthrough;
|
|
||||||
|
|
||||||
case SIOCGHWTSTAMP:
|
case SIOCGHWTSTAMP:
|
||||||
|
return dev_get_hwtstamp(dev, ifr);
|
||||||
|
|
||||||
case SIOCGMIIPHY:
|
case SIOCGMIIPHY:
|
||||||
case SIOCGMIIREG:
|
case SIOCGMIIREG:
|
||||||
case SIOCSMIIREG:
|
case SIOCSMIIREG:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user