]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: gianfar: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
authorVladimir Oltean <vladimir.oltean@nxp.com>
Thu, 8 May 2025 14:36:59 +0000 (17:36 +0300)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 May 2025 23:42:29 +0000 (16:42 -0700)
New timestamping API was introduced in commit 66f7223039c0 ("net: add
NDOs for configuring hardware timestamping") from kernel v6.6. It is
time to convert the gianfar driver to the new API, so that the
ndo_eth_ioctl() path can be removed completely.

Don't propagate the unnecessary "config.flags = 0;" assignment to
gfar_hwtstamp_get(), because dev_get_hwtstamp() provides a zero
initialized struct kernel_hwtstamp_config.

After removing timestamping logic from gfar_ioctl(), the rest is
equivalent to phy_do_ioctl_running(), so provide that directly as our
ndo_eth_ioctl() implementation.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com> # LS1021A
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20250508143659.1944220-1-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/gianfar.c

index deb35b38c97666b4b2a193ce2f71bc41af76354f..bcbcad61351227dbc666f132a27b4b6154c45645 100644 (file)
@@ -2061,15 +2061,13 @@ static void gfar_timeout(struct net_device *dev, unsigned int txqueue)
        schedule_work(&priv->reset_task);
 }
 
-static int gfar_hwtstamp_set(struct net_device *netdev, struct ifreq *ifr)
+static int gfar_hwtstamp_set(struct net_device *netdev,
+                            struct kernel_hwtstamp_config *config,
+                            struct netlink_ext_ack *extack)
 {
-       struct hwtstamp_config config;
        struct gfar_private *priv = netdev_priv(netdev);
 
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
-
-       switch (config.tx_type) {
+       switch (config->tx_type) {
        case HWTSTAMP_TX_OFF:
                priv->hwts_tx_en = 0;
                break;
@@ -2082,7 +2080,7 @@ static int gfar_hwtstamp_set(struct net_device *netdev, struct ifreq *ifr)
                return -ERANGE;
        }
 
-       switch (config.rx_filter) {
+       switch (config->rx_filter) {
        case HWTSTAMP_FILTER_NONE:
                if (priv->hwts_rx_en) {
                        priv->hwts_rx_en = 0;
@@ -2096,44 +2094,23 @@ static int gfar_hwtstamp_set(struct net_device *netdev, struct ifreq *ifr)
                        priv->hwts_rx_en = 1;
                        reset_gfar(netdev);
                }
-               config.rx_filter = HWTSTAMP_FILTER_ALL;
+               config->rx_filter = HWTSTAMP_FILTER_ALL;
                break;
        }
 
-       return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
-               -EFAULT : 0;
+       return 0;
 }
 
-static int gfar_hwtstamp_get(struct net_device *netdev, struct ifreq *ifr)
+static int gfar_hwtstamp_get(struct net_device *netdev,
+                            struct kernel_hwtstamp_config *config)
 {
-       struct hwtstamp_config config;
        struct gfar_private *priv = netdev_priv(netdev);
 
-       config.flags = 0;
-       config.tx_type = priv->hwts_tx_en ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
-       config.rx_filter = (priv->hwts_rx_en ?
-                           HWTSTAMP_FILTER_ALL : HWTSTAMP_FILTER_NONE);
-
-       return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
-               -EFAULT : 0;
-}
-
-static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-{
-       struct phy_device *phydev = dev->phydev;
+       config->tx_type = priv->hwts_tx_en ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
+       config->rx_filter = priv->hwts_rx_en ? HWTSTAMP_FILTER_ALL :
+                           HWTSTAMP_FILTER_NONE;
 
-       if (!netif_running(dev))
-               return -EINVAL;
-
-       if (cmd == SIOCSHWTSTAMP)
-               return gfar_hwtstamp_set(dev, rq);
-       if (cmd == SIOCGHWTSTAMP)
-               return gfar_hwtstamp_get(dev, rq);
-
-       if (!phydev)
-               return -ENODEV;
-
-       return phy_mii_ioctl(phydev, rq, cmd);
+       return 0;
 }
 
 /* Interrupt Handler for Transmit complete */
@@ -3174,7 +3151,7 @@ static const struct net_device_ops gfar_netdev_ops = {
        .ndo_set_features = gfar_set_features,
        .ndo_set_rx_mode = gfar_set_multi,
        .ndo_tx_timeout = gfar_timeout,
-       .ndo_eth_ioctl = gfar_ioctl,
+       .ndo_eth_ioctl = phy_do_ioctl_running,
        .ndo_get_stats64 = gfar_get_stats64,
        .ndo_change_carrier = fixed_phy_change_carrier,
        .ndo_set_mac_address = gfar_set_mac_addr,
@@ -3182,6 +3159,8 @@ static const struct net_device_ops gfar_netdev_ops = {
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller = gfar_netpoll,
 #endif
+       .ndo_hwtstamp_get = gfar_hwtstamp_get,
+       .ndo_hwtstamp_set = gfar_hwtstamp_set,
 };
 
 /* Set up the ethernet device structure, private data,