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

Reply via email to