On Mon, Jul 27, 2020 at 05:21:55PM +0800, Ooi, Joyce wrote: > +/* ioctl to configure timestamping */ > +static int tse_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) > +{ > + struct altera_tse_private *priv = netdev_priv(dev); > + struct hwtstamp_config config; > + > + if (!netif_running(dev)) > + return -EINVAL; > + > + if (!priv->has_ptp) { > + netdev_alert(priv->dev, "Timestamping not supported"); > + return -EOPNOTSUPP; > + }
The user might well have a PHY that supports time stamping. The code must pass the ioctl through to the PHY even when !priv->has_ptp. > + > + if (!dev->phydev) > + return -EINVAL; > + > + if (!phy_has_hwtstamp(dev->phydev)) { > + if (cmd == SIOCSHWTSTAMP) { > + if (copy_from_user(&config, ifr->ifr_data, > + sizeof(struct hwtstamp_config))) > + return -EFAULT; > + > + if (config.flags) > + return -EINVAL; > + > + switch (config.tx_type) { > + case HWTSTAMP_TX_OFF: > + priv->hwts_tx_en = 0; > + break; > + case HWTSTAMP_TX_ON: > + priv->hwts_tx_en = 1; > + break; > + default: > + return -ERANGE; > + } > + > + switch (config.rx_filter) { > + case HWTSTAMP_FILTER_NONE: > + priv->hwts_rx_en = 0; > + config.rx_filter = HWTSTAMP_FILTER_NONE; > + break; > + default: > + priv->hwts_rx_en = 1; > + config.rx_filter = HWTSTAMP_FILTER_ALL; > + break; > + } > + > + if (copy_to_user(ifr->ifr_data, &config, > + sizeof(struct hwtstamp_config))) > + return -EFAULT; > + else > + return 0; > + } > + > + if (cmd == SIOCGHWTSTAMP) { > + config.flags = 0; > + > + if (priv->hwts_tx_en) > + config.tx_type = HWTSTAMP_TX_ON; > + else > + config.tx_type = HWTSTAMP_TX_OFF; > + > + if (priv->hwts_rx_en) > + config.rx_filter = HWTSTAMP_FILTER_ALL; > + else > + config.rx_filter = HWTSTAMP_FILTER_NONE; > + > + if (copy_to_user(ifr->ifr_data, &config, > + sizeof(struct hwtstamp_config))) > + return -EFAULT; > + else > + return 0; > + } > + } > + > + return phy_mii_ioctl(dev->phydev, ifr, cmd); > +} Thanks, Richard