Commit 4ee58e1e authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller
Browse files

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 f685e609 ("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: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1193db2a
Loading
Loading
Loading
Loading
+26 −13
Original line number Diff line number Diff line
@@ -246,20 +246,34 @@ static int dev_eth_ioctl(struct net_device *dev,
			 struct ifreq *ifr, unsigned int cmd)
{
	const struct net_device_ops *ops = dev->netdev_ops;
	int err;

	err = dsa_ndo_eth_ioctl(dev, ifr, cmd);
	if (err != -EOPNOTSUPP)
		return err;
	if (!ops->ndo_eth_ioctl)
		return -EOPNOTSUPP;

	if (ops->ndo_eth_ioctl) {
		if (netif_device_present(dev))
			err = ops->ndo_eth_ioctl(dev, ifr, cmd);
		else
			err = -ENODEV;
	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;

	err = net_hwtstamp_validate(ifr);
	if (err)
		return err;

	err = dsa_ndo_eth_ioctl(dev, ifr, SIOCSHWTSTAMP);
	if (err != -EOPNOTSUPP)
		return err;

	return dev_eth_ioctl(dev, ifr, SIOCSHWTSTAMP);
}

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);

	case SIOCSHWTSTAMP:
		err = net_hwtstamp_validate(ifr);
		if (err)
			return err;
		fallthrough;
		return dev_set_hwtstamp(dev, ifr);

	case SIOCGHWTSTAMP:
		return dev_get_hwtstamp(dev, ifr);

	case SIOCGMIIPHY:
	case SIOCGMIIREG:
	case SIOCSMIIREG: