[PATCH RFC V1 net-next 4/4] net: fix up drivers WRT phy time stamping

From: Richard Cochran
Date: Mon Jan 03 2022 - 18:26:16 EST


For "git bisect" correctness, this patch should be squashed in to the
previous one, but it is broken out here for the purpose of review.

Signed-off-by: Richard Cochran <richardcochran@xxxxxxxxx>
---
drivers/net/ethernet/freescale/fec_main.c | 23 +++++++++-----------
drivers/net/ethernet/mscc/ocelot_net.c | 21 +++++++++---------
drivers/net/ethernet/ti/cpsw_priv.c | 12 +++++------
drivers/net/ethernet/ti/netcp_ethss.c | 26 +++++------------------
drivers/net/macvlan.c | 4 +---
5 files changed, 32 insertions(+), 54 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 796133de527e..2f62990f9ced 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -2935,22 +2935,19 @@ static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
if (!netif_running(ndev))
return -EINVAL;

+ switch (cmd) {
+ case SIOCSHWTSTAMP:
+ return fep->bufdesc_ex ? fec_ptp_set(ndev, rq) :
+ -EOPNOTSUPP;
+
+ case SIOCGHWTSTAMP:
+ return fep->bufdesc_ex ? fec_ptp_get(ndev, rq) :
+ -EOPNOTSUPP;
+ }
+
if (!phydev)
return -ENODEV;

- if (fep->bufdesc_ex) {
- bool use_fec_hwts = !phy_has_hwtstamp(phydev);
-
- if (cmd == SIOCSHWTSTAMP) {
- if (use_fec_hwts)
- return fec_ptp_set(ndev, rq);
- fec_ptp_disable_hwts(ndev);
- } else if (cmd == SIOCGHWTSTAMP) {
- if (use_fec_hwts)
- return fec_ptp_get(ndev, rq);
- }
- }
-
return phy_mii_ioctl(phydev, rq, cmd);
}

diff --git a/drivers/net/ethernet/mscc/ocelot_net.c b/drivers/net/ethernet/mscc/ocelot_net.c
index 8115c3db252e..d9a0988404d0 100644
--- a/drivers/net/ethernet/mscc/ocelot_net.c
+++ b/drivers/net/ethernet/mscc/ocelot_net.c
@@ -755,18 +755,19 @@ static int ocelot_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
struct ocelot *ocelot = priv->port.ocelot;
int port = priv->chip_port;

- /* If the attached PHY device isn't capable of timestamping operations,
- * use our own (when possible).
- */
- if (!phy_has_hwtstamp(dev->phydev) && ocelot->ptp) {
- switch (cmd) {
- case SIOCSHWTSTAMP:
- return ocelot_hwstamp_set(ocelot, port, ifr);
- case SIOCGHWTSTAMP:
- return ocelot_hwstamp_get(ocelot, port, ifr);
- }
+ switch (cmd) {
+ case SIOCSHWTSTAMP:
+ return ocelot->ptp ? ocelot_hwstamp_set(ocelot, port, ifr) :
+ -EOPNOTSUPP;
+
+ case SIOCGHWTSTAMP:
+ return ocelot->ptp ? ocelot_hwstamp_get(ocelot, port, ifr) :
+ -EOPNOTSUPP;
}

+ if (!dev->phydev)
+ return -ENODEV;
+
return phy_mii_ioctl(dev->phydev, ifr, cmd);
}

diff --git a/drivers/net/ethernet/ti/cpsw_priv.c b/drivers/net/ethernet/ti/cpsw_priv.c
index 8624a044776f..5825efc6426e 100644
--- a/drivers/net/ethernet/ti/cpsw_priv.c
+++ b/drivers/net/ethernet/ti/cpsw_priv.c
@@ -713,13 +713,11 @@ int cpsw_ndo_ioctl(struct net_device *dev, struct ifreq *req, int cmd)

phy = cpsw->slaves[slave_no].phy;

- if (!phy_has_hwtstamp(phy)) {
- switch (cmd) {
- case SIOCSHWTSTAMP:
- return cpsw_hwtstamp_set(dev, req);
- case SIOCGHWTSTAMP:
- return cpsw_hwtstamp_get(dev, req);
- }
+ switch (cmd) {
+ case SIOCSHWTSTAMP:
+ return cpsw_hwtstamp_set(dev, req);
+ case SIOCGHWTSTAMP:
+ return cpsw_hwtstamp_get(dev, req);
}

if (phy)
diff --git a/drivers/net/ethernet/ti/netcp_ethss.c b/drivers/net/ethernet/ti/netcp_ethss.c
index 751fb0bc65c5..36ce80f8bd6b 100644
--- a/drivers/net/ethernet/ti/netcp_ethss.c
+++ b/drivers/net/ethernet/ti/netcp_ethss.c
@@ -2557,15 +2557,6 @@ static int gbe_txtstamp_mark_pkt(struct gbe_intf *gbe_intf,
!gbe_dev->tx_ts_enabled)
return 0;

- /* If phy has the txtstamp api, assume it will do it.
- * We mark it here because skb_tx_timestamp() is called
- * after all the txhooks are called.
- */
- if (phy_has_txtstamp(phydev)) {
- skb_shinfo(p_info->skb)->tx_flags |= SKBTX_IN_PROGRESS;
- return 0;
- }
-
if (gbe_need_txtstamp(gbe_intf, p_info)) {
p_info->txtstamp = gbe_txtstamp;
p_info->ts_context = (void *)gbe_intf;
@@ -2583,11 +2574,6 @@ static int gbe_rxtstamp(struct gbe_intf *gbe_intf, struct netcp_packet *p_info)
if (p_info->rxtstamp_complete)
return 0;

- if (phy_has_rxtstamp(phydev)) {
- p_info->rxtstamp_complete = true;
- return 0;
- }
-
if (gbe_dev->rx_ts_enabled)
cpts_rx_timestamp(gbe_dev->cpts, p_info->skb);

@@ -2821,13 +2807,11 @@ static int gbe_ioctl(void *intf_priv, struct ifreq *req, int cmd)
struct gbe_intf *gbe_intf = intf_priv;
struct phy_device *phy = gbe_intf->slave->phy;

- if (!phy_has_hwtstamp(phy)) {
- switch (cmd) {
- case SIOCGHWTSTAMP:
- return gbe_hwtstamp_get(gbe_intf, req);
- case SIOCSHWTSTAMP:
- return gbe_hwtstamp_set(gbe_intf, req);
- }
+ switch (cmd) {
+ case SIOCGHWTSTAMP:
+ return gbe_hwtstamp_get(gbe_intf, req);
+ case SIOCSHWTSTAMP:
+ return gbe_hwtstamp_set(gbe_intf, req);
}

if (phy)
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 6ef5f77be4d0..13264c3e4192 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -1055,9 +1055,7 @@ static int macvlan_ethtool_get_ts_info(struct net_device *dev,
const struct ethtool_ops *ops = real_dev->ethtool_ops;
struct phy_device *phydev = real_dev->phydev;

- if (phy_has_tsinfo(phydev)) {
- return phy_ts_info(phydev, info);
- } else if (ops->get_ts_info) {
+ if (ops->get_ts_info) {
return ops->get_ts_info(real_dev, info);
} else {
info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
--
2.20.1