]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: mlxsw: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
authorVladimir Oltean <vladimir.oltean@nxp.com>
Mon, 12 May 2025 15:44:11 +0000 (18:44 +0300)
committerJakub Kicinski <kuba@kernel.org>
Tue, 13 May 2025 23:38:25 +0000 (16:38 -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 mlxsw driver to the new API, so that the
ndo_eth_ioctl() path can be removed completely.

The UAPI is still ioctl-only, but it's best to remove the "ioctl"
mentions from the driver in case a netlink variant appears.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/20250512154411.848614-1-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.h

index 3080ea032e7f332f27b5b3830e57e7306e423dc5..618957d6566364f3b57d99307f188b251c73278d 100644 (file)
@@ -1159,63 +1159,31 @@ static int mlxsw_sp_set_features(struct net_device *dev,
        return 0;
 }
 
-static int mlxsw_sp_port_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                                     struct ifreq *ifr)
+static int mlxsw_sp_port_hwtstamp_set(struct net_device *dev,
+                                     struct kernel_hwtstamp_config *config,
+                                     struct netlink_ext_ack *extack)
 {
-       struct hwtstamp_config config;
-       int err;
-
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
-
-       err = mlxsw_sp_port->mlxsw_sp->ptp_ops->hwtstamp_set(mlxsw_sp_port,
-                                                            &config);
-       if (err)
-               return err;
-
-       if (copy_to_user(ifr->ifr_data, &config, sizeof(config)))
-               return -EFAULT;
+       struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
 
-       return 0;
+       return mlxsw_sp_port->mlxsw_sp->ptp_ops->hwtstamp_set(mlxsw_sp_port,
+                                                             config, extack);
 }
 
-static int mlxsw_sp_port_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
-                                     struct ifreq *ifr)
+static int mlxsw_sp_port_hwtstamp_get(struct net_device *dev,
+                                     struct kernel_hwtstamp_config *config)
 {
-       struct hwtstamp_config config;
-       int err;
-
-       err = mlxsw_sp_port->mlxsw_sp->ptp_ops->hwtstamp_get(mlxsw_sp_port,
-                                                            &config);
-       if (err)
-               return err;
-
-       if (copy_to_user(ifr->ifr_data, &config, sizeof(config)))
-               return -EFAULT;
+       struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
 
-       return 0;
+       return mlxsw_sp_port->mlxsw_sp->ptp_ops->hwtstamp_get(mlxsw_sp_port,
+                                                             config);
 }
 
 static inline void mlxsw_sp_port_ptp_clear(struct mlxsw_sp_port *mlxsw_sp_port)
 {
-       struct hwtstamp_config config = {0};
-
-       mlxsw_sp_port->mlxsw_sp->ptp_ops->hwtstamp_set(mlxsw_sp_port, &config);
-}
-
-static int
-mlxsw_sp_port_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-{
-       struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
+       struct kernel_hwtstamp_config config = {};
 
-       switch (cmd) {
-       case SIOCSHWTSTAMP:
-               return mlxsw_sp_port_hwtstamp_set(mlxsw_sp_port, ifr);
-       case SIOCGHWTSTAMP:
-               return mlxsw_sp_port_hwtstamp_get(mlxsw_sp_port, ifr);
-       default:
-               return -EOPNOTSUPP;
-       }
+       mlxsw_sp_port->mlxsw_sp->ptp_ops->hwtstamp_set(mlxsw_sp_port, &config,
+                                                      NULL);
 }
 
 static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
@@ -1232,7 +1200,8 @@ static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
        .ndo_vlan_rx_add_vid    = mlxsw_sp_port_add_vid,
        .ndo_vlan_rx_kill_vid   = mlxsw_sp_port_kill_vid,
        .ndo_set_features       = mlxsw_sp_set_features,
-       .ndo_eth_ioctl          = mlxsw_sp_port_ioctl,
+       .ndo_hwtstamp_get       = mlxsw_sp_port_hwtstamp_get,
+       .ndo_hwtstamp_set       = mlxsw_sp_port_hwtstamp_set,
 };
 
 static int
index 37cd1d002b3bed6cb62c96eb78f3ee6ed8a28fc5..b03ff9e044f9e2d7bda250540c29132549713e0a 100644 (file)
@@ -233,9 +233,10 @@ struct mlxsw_sp_ptp_ops {
                            u16 local_port);
 
        int (*hwtstamp_get)(struct mlxsw_sp_port *mlxsw_sp_port,
-                           struct hwtstamp_config *config);
+                           struct kernel_hwtstamp_config *config);
        int (*hwtstamp_set)(struct mlxsw_sp_port *mlxsw_sp_port,
-                           struct hwtstamp_config *config);
+                           struct kernel_hwtstamp_config *config,
+                           struct netlink_ext_ack *extack);
        void (*shaper_work)(struct work_struct *work);
        int (*get_ts_info)(struct mlxsw_sp *mlxsw_sp,
                           struct kernel_ethtool_ts_info *info);
@@ -351,7 +352,7 @@ struct mlxsw_sp_port {
        struct mlxsw_sp_flow_block *eg_flow_block;
        struct {
                struct delayed_work shaper_dw;
-               struct hwtstamp_config hwtstamp_config;
+               struct kernel_hwtstamp_config hwtstamp_config;
                u16 ing_types;
                u16 egr_types;
                struct mlxsw_sp_ptp_port_stats stats;
index ca8b9d18fbb9a77da1b268b4f6c3f31df8291b0f..e8182dd76c7dc85b60838cef99197325fef60763 100644 (file)
@@ -46,7 +46,7 @@ struct mlxsw_sp2_ptp_state {
        refcount_t ptp_port_enabled_ref; /* Number of ports with time stamping
                                          * enabled.
                                          */
-       struct hwtstamp_config config;
+       struct kernel_hwtstamp_config config;
        struct mutex lock; /* Protects 'config' and HW configuration. */
 };
 
@@ -1083,14 +1083,14 @@ void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state_common)
 }
 
 int mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
-                              struct hwtstamp_config *config)
+                              struct kernel_hwtstamp_config *config)
 {
        *config = mlxsw_sp_port->ptp.hwtstamp_config;
        return 0;
 }
 
 static int
-mlxsw_sp1_ptp_get_message_types(const struct hwtstamp_config *config,
+mlxsw_sp1_ptp_get_message_types(const struct kernel_hwtstamp_config *config,
                                u16 *p_ing_types, u16 *p_egr_types,
                                enum hwtstamp_rx_filters *p_rx_filter)
 {
@@ -1246,7 +1246,8 @@ void mlxsw_sp1_ptp_shaper_work(struct work_struct *work)
 }
 
 int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                              struct hwtstamp_config *config)
+                              struct kernel_hwtstamp_config *config,
+                              struct netlink_ext_ack *extack)
 {
        enum hwtstamp_rx_filters rx_filter;
        u16 ing_types;
@@ -1270,7 +1271,7 @@ int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
        if (err)
                return err;
 
-       /* Notify the ioctl caller what we are actually timestamping. */
+       /* Notify the caller what we are actually timestamping. */
        config->rx_filter = rx_filter;
 
        return 0;
@@ -1451,7 +1452,7 @@ void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
 }
 
 int mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
-                              struct hwtstamp_config *config)
+                              struct kernel_hwtstamp_config *config)
 {
        struct mlxsw_sp2_ptp_state *ptp_state;
 
@@ -1465,7 +1466,7 @@ int mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
 }
 
 static int
-mlxsw_sp2_ptp_get_message_types(const struct hwtstamp_config *config,
+mlxsw_sp2_ptp_get_message_types(const struct kernel_hwtstamp_config *config,
                                u16 *p_ing_types, u16 *p_egr_types,
                                enum hwtstamp_rx_filters *p_rx_filter)
 {
@@ -1542,7 +1543,7 @@ static int mlxsw_sp2_ptp_mtpcpc_set(struct mlxsw_sp *mlxsw_sp, bool ptp_trap_en,
 
 static int mlxsw_sp2_ptp_enable(struct mlxsw_sp *mlxsw_sp, u16 ing_types,
                                u16 egr_types,
-                               struct hwtstamp_config new_config)
+                               struct kernel_hwtstamp_config new_config)
 {
        struct mlxsw_sp2_ptp_state *ptp_state = mlxsw_sp2_ptp_state(mlxsw_sp);
        int err;
@@ -1556,7 +1557,7 @@ static int mlxsw_sp2_ptp_enable(struct mlxsw_sp *mlxsw_sp, u16 ing_types,
 }
 
 static int mlxsw_sp2_ptp_disable(struct mlxsw_sp *mlxsw_sp,
-                                struct hwtstamp_config new_config)
+                                struct kernel_hwtstamp_config new_config)
 {
        struct mlxsw_sp2_ptp_state *ptp_state = mlxsw_sp2_ptp_state(mlxsw_sp);
        int err;
@@ -1571,7 +1572,7 @@ static int mlxsw_sp2_ptp_disable(struct mlxsw_sp *mlxsw_sp,
 
 static int mlxsw_sp2_ptp_configure_port(struct mlxsw_sp_port *mlxsw_sp_port,
                                        u16 ing_types, u16 egr_types,
-                                       struct hwtstamp_config new_config)
+                                       struct kernel_hwtstamp_config new_config)
 {
        struct mlxsw_sp2_ptp_state *ptp_state;
        int err;
@@ -1592,7 +1593,7 @@ static int mlxsw_sp2_ptp_configure_port(struct mlxsw_sp_port *mlxsw_sp_port,
 }
 
 static int mlxsw_sp2_ptp_deconfigure_port(struct mlxsw_sp_port *mlxsw_sp_port,
-                                         struct hwtstamp_config new_config)
+                                         struct kernel_hwtstamp_config new_config)
 {
        struct mlxsw_sp2_ptp_state *ptp_state;
        int err;
@@ -1614,11 +1615,12 @@ err_ptp_disable:
 }
 
 int mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                              struct hwtstamp_config *config)
+                              struct kernel_hwtstamp_config *config,
+                              struct netlink_ext_ack *extack)
 {
+       struct kernel_hwtstamp_config new_config;
        struct mlxsw_sp2_ptp_state *ptp_state;
        enum hwtstamp_rx_filters rx_filter;
-       struct hwtstamp_config new_config;
        u16 new_ing_types, new_egr_types;
        bool ptp_enabled;
        int err;
@@ -1652,7 +1654,7 @@ int mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
        mlxsw_sp_port->ptp.ing_types = new_ing_types;
        mlxsw_sp_port->ptp.egr_types = new_egr_types;
 
-       /* Notify the ioctl caller what we are actually timestamping. */
+       /* Notify the caller what we are actually timestamping. */
        config->rx_filter = rx_filter;
        mutex_unlock(&ptp_state->lock);
 
index 102db9060135eacee5eebfb3d9abaf0e98128213..df37f147083036a627cc35752d7e58c290e6ce37 100644 (file)
@@ -34,10 +34,11 @@ void mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress,
                                 u64 timestamp);
 
 int mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
-                              struct hwtstamp_config *config);
+                              struct kernel_hwtstamp_config *config);
 
 int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                              struct hwtstamp_config *config);
+                              struct kernel_hwtstamp_config *config,
+                              struct netlink_ext_ack *extack);
 
 void mlxsw_sp1_ptp_shaper_work(struct work_struct *work);
 
@@ -65,10 +66,11 @@ void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
                               struct sk_buff *skb, u16 local_port);
 
 int mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
-                              struct hwtstamp_config *config);
+                              struct kernel_hwtstamp_config *config);
 
 int mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                              struct hwtstamp_config *config);
+                              struct kernel_hwtstamp_config *config,
+                              struct netlink_ext_ack *extack);
 
 int mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
                              struct kernel_ethtool_ts_info *info);
@@ -117,14 +119,15 @@ mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress,
 
 static inline int
 mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
-                          struct hwtstamp_config *config)
+                          struct kernel_hwtstamp_config *config)
 {
        return -EOPNOTSUPP;
 }
 
 static inline int
 mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                          struct hwtstamp_config *config)
+                          struct kernel_hwtstamp_config *config,
+                          struct netlink_ext_ack *extack)
 {
        return -EOPNOTSUPP;
 }
@@ -181,14 +184,15 @@ static inline void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
 
 static inline int
 mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
-                          struct hwtstamp_config *config)
+                          struct kernel_hwtstamp_config *config)
 {
        return -EOPNOTSUPP;
 }
 
 static inline int
 mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                          struct hwtstamp_config *config)
+                          struct kernel_hwtstamp_config *config,
+                          struct netlink_ext_ack *extack)
 {
        return -EOPNOTSUPP;
 }