Re: [PATCH v5 08/10] net: eth: altera: add support for ptp and timestamping

From: Richard Cochran
Date: Mon Jul 27 2020 - 10:29:36 EST


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