mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 11:40:19 -04:00
net: mlxsw: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
New timestamping API was introduced in commit 66f7223039 ("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>
This commit is contained in:
committed by
Jakub Kicinski
parent
0d161eb27d
commit
ae605349e1
@@ -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;
|
||||
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
||||
|
||||
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;
|
||||
|
||||
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};
|
||||
struct kernel_hwtstamp_config config = {};
|
||||
|
||||
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);
|
||||
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 @@ static int mlxsw_sp2_ptp_deconfigure_port(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user