mlxsw: spectrum: PTP: Support ethtool get_ts_info
The get_ts_info callback is used for obtaining information about timestamping capabilities of a network device. On Spectrum-1, implement it to advertise the PHC and the capability to do HW timestamping, and the supported RX and TX filters. Signed-off-by: Petr Machata <petrm@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8748642751
commit
87ee07f8e2
|
@ -171,6 +171,8 @@ struct mlxsw_sp_ptp_ops {
|
|||
struct hwtstamp_config *config);
|
||||
int (*hwtstamp_set)(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
struct hwtstamp_config *config);
|
||||
int (*get_ts_info)(struct mlxsw_sp *mlxsw_sp,
|
||||
struct ethtool_ts_info *info);
|
||||
};
|
||||
|
||||
static int mlxsw_sp_component_query(struct mlxfw_dev *mlxfw_dev,
|
||||
|
@ -3316,6 +3318,15 @@ static int mlxsw_sp_get_module_eeprom(struct net_device *netdev,
|
|||
return err;
|
||||
}
|
||||
|
||||
static int
|
||||
mlxsw_sp_get_ts_info(struct net_device *netdev, struct ethtool_ts_info *info)
|
||||
{
|
||||
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(netdev);
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
|
||||
return mlxsw_sp->ptp_ops->get_ts_info(mlxsw_sp, info);
|
||||
}
|
||||
|
||||
static const struct ethtool_ops mlxsw_sp_port_ethtool_ops = {
|
||||
.get_drvinfo = mlxsw_sp_port_get_drvinfo,
|
||||
.get_link = ethtool_op_get_link,
|
||||
|
@ -3329,6 +3340,7 @@ static const struct ethtool_ops mlxsw_sp_port_ethtool_ops = {
|
|||
.set_link_ksettings = mlxsw_sp_port_set_link_ksettings,
|
||||
.get_module_info = mlxsw_sp_get_module_info,
|
||||
.get_module_eeprom = mlxsw_sp_get_module_eeprom,
|
||||
.get_ts_info = mlxsw_sp_get_ts_info,
|
||||
};
|
||||
|
||||
static int
|
||||
|
@ -4547,6 +4559,7 @@ static const struct mlxsw_sp_ptp_ops mlxsw_sp1_ptp_ops = {
|
|||
.transmitted = mlxsw_sp1_ptp_transmitted,
|
||||
.hwtstamp_get = mlxsw_sp1_ptp_hwtstamp_get,
|
||||
.hwtstamp_set = mlxsw_sp1_ptp_hwtstamp_set,
|
||||
.get_ts_info = mlxsw_sp1_ptp_get_ts_info,
|
||||
};
|
||||
|
||||
static const struct mlxsw_sp_ptp_ops mlxsw_sp2_ptp_ops = {
|
||||
|
@ -4558,6 +4571,7 @@ static const struct mlxsw_sp_ptp_ops mlxsw_sp2_ptp_ops = {
|
|||
.transmitted = mlxsw_sp2_ptp_transmitted,
|
||||
.hwtstamp_get = mlxsw_sp2_ptp_hwtstamp_get,
|
||||
.hwtstamp_set = mlxsw_sp2_ptp_hwtstamp_set,
|
||||
.get_ts_info = mlxsw_sp2_ptp_get_ts_info,
|
||||
};
|
||||
|
||||
static int mlxsw_sp_netdevice_event(struct notifier_block *unused,
|
||||
|
|
|
@ -933,3 +933,21 @@ int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
|
||||
struct ethtool_ts_info *info)
|
||||
{
|
||||
info->phc_index = ptp_clock_index(mlxsw_sp->clock->ptp);
|
||||
|
||||
info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE |
|
||||
SOF_TIMESTAMPING_RX_HARDWARE |
|
||||
SOF_TIMESTAMPING_RAW_HARDWARE;
|
||||
|
||||
info->tx_types = BIT(HWTSTAMP_TX_OFF) |
|
||||
BIT(HWTSTAMP_TX_ON);
|
||||
|
||||
info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
|
||||
BIT(HWTSTAMP_FILTER_ALL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,14 @@ enum {
|
|||
MLXSW_SP_PTP_MESSAGE_TYPE_PDELAY_RESP,
|
||||
};
|
||||
|
||||
static inline int mlxsw_sp_ptp_get_ts_info_noptp(struct ethtool_ts_info *info)
|
||||
{
|
||||
info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
|
||||
SOF_TIMESTAMPING_SOFTWARE;
|
||||
info->phc_index = -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if IS_REACHABLE(CONFIG_PTP_1588_CLOCK)
|
||||
|
||||
struct mlxsw_sp_ptp_clock *
|
||||
|
@ -46,6 +54,9 @@ int mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
struct hwtstamp_config *config);
|
||||
|
||||
int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
|
||||
struct ethtool_ts_info *info);
|
||||
|
||||
#else
|
||||
|
||||
static inline struct mlxsw_sp_ptp_clock *
|
||||
|
@ -102,6 +113,12 @@ mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
|
||||
struct ethtool_ts_info *info)
|
||||
{
|
||||
return mlxsw_sp_ptp_get_ts_info_noptp(info);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline struct mlxsw_sp_ptp_clock *
|
||||
|
@ -150,4 +167,10 @@ mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
|
||||
struct ethtool_ts_info *info)
|
||||
{
|
||||
return mlxsw_sp_ptp_get_ts_info_noptp(info);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue