| /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ |
| /* Copyright (c) 2019 Mellanox Technologies. All rights reserved */ |
| |
| #ifndef _MLXSW_SPECTRUM_PTP_H |
| #define _MLXSW_SPECTRUM_PTP_H |
| |
| #include <linux/device.h> |
| #include <linux/rhashtable.h> |
| |
| struct mlxsw_sp; |
| struct mlxsw_sp_port; |
| struct mlxsw_sp_ptp_clock; |
| |
| enum { |
| MLXSW_SP_PTP_MESSAGE_TYPE_SYNC, |
| MLXSW_SP_PTP_MESSAGE_TYPE_DELAY_REQ, |
| MLXSW_SP_PTP_MESSAGE_TYPE_PDELAY_REQ, |
| 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 * |
| mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev); |
| |
| void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock); |
| |
| struct mlxsw_sp_ptp_state *mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp); |
| |
| void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state); |
| |
| void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, |
| u8 local_port); |
| |
| void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, |
| struct sk_buff *skb, u8 local_port); |
| |
| void mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress, |
| u8 local_port, u8 message_type, |
| u8 domain_number, u16 sequence_id, |
| u64 timestamp); |
| |
| int mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, |
| struct hwtstamp_config *config); |
| |
| int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, |
| struct hwtstamp_config *config); |
| |
| void mlxsw_sp1_ptp_shaper_work(struct work_struct *work); |
| |
| int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, |
| struct ethtool_ts_info *info); |
| |
| int mlxsw_sp1_get_stats_count(void); |
| void mlxsw_sp1_get_stats_strings(u8 **p); |
| void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, |
| u64 *data, int data_index); |
| |
| #else |
| |
| static inline struct mlxsw_sp_ptp_clock * |
| mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev) |
| { |
| return NULL; |
| } |
| |
| static inline void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock) |
| { |
| } |
| |
| static inline struct mlxsw_sp_ptp_state * |
| mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp) |
| { |
| return NULL; |
| } |
| |
| static inline void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state) |
| { |
| } |
| |
| static inline void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, |
| struct sk_buff *skb, u8 local_port) |
| { |
| mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp); |
| } |
| |
| static inline void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, |
| struct sk_buff *skb, u8 local_port) |
| { |
| dev_kfree_skb_any(skb); |
| } |
| |
| static inline void |
| mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress, |
| u8 local_port, u8 message_type, |
| u8 domain_number, |
| u16 sequence_id, u64 timestamp) |
| { |
| } |
| |
| static inline int |
| mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, |
| struct hwtstamp_config *config) |
| { |
| return -EOPNOTSUPP; |
| } |
| |
| static inline int |
| mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, |
| struct hwtstamp_config *config) |
| { |
| return -EOPNOTSUPP; |
| } |
| |
| static inline void mlxsw_sp1_ptp_shaper_work(struct work_struct *work) |
| { |
| } |
| |
| 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); |
| } |
| |
| static inline int mlxsw_sp1_get_stats_count(void) |
| { |
| return 0; |
| } |
| |
| static inline void mlxsw_sp1_get_stats_strings(u8 **p) |
| { |
| } |
| |
| static inline void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, |
| u64 *data, int data_index) |
| { |
| } |
| #endif |
| |
| static inline struct mlxsw_sp_ptp_clock * |
| mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev) |
| { |
| return NULL; |
| } |
| |
| static inline void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock) |
| { |
| } |
| |
| static inline struct mlxsw_sp_ptp_state * |
| mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp) |
| { |
| return NULL; |
| } |
| |
| static inline void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state) |
| { |
| } |
| |
| static inline void mlxsw_sp2_ptp_receive(struct mlxsw_sp *mlxsw_sp, |
| struct sk_buff *skb, u8 local_port) |
| { |
| mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp); |
| } |
| |
| static inline void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, |
| struct sk_buff *skb, u8 local_port) |
| { |
| dev_kfree_skb_any(skb); |
| } |
| |
| static inline int |
| mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, |
| struct hwtstamp_config *config) |
| { |
| return -EOPNOTSUPP; |
| } |
| |
| static inline int |
| mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, |
| struct hwtstamp_config *config) |
| { |
| return -EOPNOTSUPP; |
| } |
| |
| static inline void mlxsw_sp2_ptp_shaper_work(struct work_struct *work) |
| { |
| } |
| |
| 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); |
| } |
| |
| static inline int mlxsw_sp2_get_stats_count(void) |
| { |
| return 0; |
| } |
| |
| static inline void mlxsw_sp2_get_stats_strings(u8 **p) |
| { |
| } |
| |
| static inline void mlxsw_sp2_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, |
| u64 *data, int data_index) |
| { |
| } |
| |
| #endif |