RE: [PATCH v5 08/10] net: eth: altera: add support for ptp and timestamping
From: Ooi, Joyce <hidden>
Date: 2020-08-07 08:00:25
Also in:
lkml
-----Original Message----- From: Richard Cochran <richardcochran@gmail.com> Sent: Monday, July 27, 2020 10:29 PM To: Ooi, Joyce <redacted> Cc: Thor Thayer <redacted>; David S . Miller [off-list ref]; Jakub Kicinski [off-list ref]; netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Dalon Westergreen [off-list ref]; Tan, Ley Foon [off-list ref]; See, Chin Liang [off-list ref]; Nguyen, Dinh [off-list ref]; Westergreen, Dalon [off-list ref] Subject: Re: [PATCH v5 08/10] net: eth: altera: add support for ptp and timestamping On Mon, Jul 27, 2020 at 05:21:55PM +0800, Ooi, Joyce wrote:quoted
+/* 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.
Ok, I'll remove 'return -EOPNOTSUPP;' to allow those that have PHY with timestamping support to go pass through ioctl.
quoted
+ + 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