1/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2/* Copyright (c) 2019 Mellanox Technologies. All rights reserved */ 3 4#ifndef _MLXSW_SPECTRUM_PTP_H 5#define _MLXSW_SPECTRUM_PTP_H 6 7#include <linux/device.h> 8#include <linux/rhashtable.h> 9 10struct mlxsw_sp; 11struct mlxsw_sp_port; 12struct mlxsw_sp_ptp_clock; 13 14static inline int mlxsw_sp_ptp_get_ts_info_noptp(struct ethtool_ts_info *info) 15{ 16 info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE | 17 SOF_TIMESTAMPING_SOFTWARE; 18 info->phc_index = -1; 19 return 0; 20} 21 22#if IS_REACHABLE(CONFIG_PTP_1588_CLOCK) 23 24struct mlxsw_sp_ptp_clock * 25mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev); 26 27void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock); 28 29struct mlxsw_sp_ptp_state *mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp); 30 31void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state); 32 33void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, 34 u16 local_port); 35 36void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 37 struct sk_buff *skb, u16 local_port); 38 39void mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress, 40 u16 local_port, u8 message_type, 41 u8 domain_number, u16 sequence_id, 42 u64 timestamp); 43 44int mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 45 struct hwtstamp_config *config); 46 47int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 48 struct hwtstamp_config *config); 49 50void mlxsw_sp1_ptp_shaper_work(struct work_struct *work); 51 52int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 53 struct ethtool_ts_info *info); 54 55int mlxsw_sp1_get_stats_count(void); 56void mlxsw_sp1_get_stats_strings(u8 **p); 57void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, 58 u64 *data, int data_index); 59 60int mlxsw_sp_ptp_txhdr_construct(struct mlxsw_core *mlxsw_core, 61 struct mlxsw_sp_port *mlxsw_sp_port, 62 struct sk_buff *skb, 63 const struct mlxsw_tx_info *tx_info); 64 65struct mlxsw_sp_ptp_clock * 66mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev); 67 68void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock); 69 70struct mlxsw_sp_ptp_state *mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp); 71 72void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state); 73 74void mlxsw_sp2_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, 75 u16 local_port); 76 77void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 78 struct sk_buff *skb, u16 local_port); 79 80int mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 81 struct hwtstamp_config *config); 82 83int mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 84 struct hwtstamp_config *config); 85 86int mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 87 struct ethtool_ts_info *info); 88 89int mlxsw_sp2_ptp_txhdr_construct(struct mlxsw_core *mlxsw_core, 90 struct mlxsw_sp_port *mlxsw_sp_port, 91 struct sk_buff *skb, 92 const struct mlxsw_tx_info *tx_info); 93 94#else 95 96static inline struct mlxsw_sp_ptp_clock * 97mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev) 98{ 99 return NULL; 100} 101 102static inline void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock) 103{ 104} 105 106static inline struct mlxsw_sp_ptp_state * 107mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp) 108{ 109 return NULL; 110} 111 112static inline void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state) 113{ 114} 115 116static inline void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, 117 struct sk_buff *skb, u16 local_port) 118{ 119 mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp); 120} 121 122static inline void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 123 struct sk_buff *skb, u16 local_port) 124{ 125 dev_kfree_skb_any(skb); 126} 127 128static inline void 129mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress, 130 u16 local_port, u8 message_type, 131 u8 domain_number, 132 u16 sequence_id, u64 timestamp) 133{ 134} 135 136static inline int 137mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 138 struct hwtstamp_config *config) 139{ 140 return -EOPNOTSUPP; 141} 142 143static inline int 144mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 145 struct hwtstamp_config *config) 146{ 147 return -EOPNOTSUPP; 148} 149 150static inline void mlxsw_sp1_ptp_shaper_work(struct work_struct *work) 151{ 152} 153 154static inline int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 155 struct ethtool_ts_info *info) 156{ 157 return mlxsw_sp_ptp_get_ts_info_noptp(info); 158} 159 160static inline int mlxsw_sp1_get_stats_count(void) 161{ 162 return 0; 163} 164 165static inline void mlxsw_sp1_get_stats_strings(u8 **p) 166{ 167} 168 169static inline void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, 170 u64 *data, int data_index) 171{ 172} 173 174static inline int 175mlxsw_sp_ptp_txhdr_construct(struct mlxsw_core *mlxsw_core, 176 struct mlxsw_sp_port *mlxsw_sp_port, 177 struct sk_buff *skb, 178 const struct mlxsw_tx_info *tx_info) 179{ 180 return -EOPNOTSUPP; 181} 182 183static inline struct mlxsw_sp_ptp_clock * 184mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev) 185{ 186 return NULL; 187} 188 189static inline void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock) 190{ 191} 192 193static inline struct mlxsw_sp_ptp_state * 194mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp) 195{ 196 return NULL; 197} 198 199static inline void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state) 200{ 201} 202 203static inline void mlxsw_sp2_ptp_receive(struct mlxsw_sp *mlxsw_sp, 204 struct sk_buff *skb, u16 local_port) 205{ 206 mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp); 207} 208 209static inline void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 210 struct sk_buff *skb, u16 local_port) 211{ 212 dev_kfree_skb_any(skb); 213} 214 215static inline int 216mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 217 struct hwtstamp_config *config) 218{ 219 return -EOPNOTSUPP; 220} 221 222static inline int 223mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 224 struct hwtstamp_config *config) 225{ 226 return -EOPNOTSUPP; 227} 228 229static inline int mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 230 struct ethtool_ts_info *info) 231{ 232 return mlxsw_sp_ptp_get_ts_info_noptp(info); 233} 234 235static inline int 236mlxsw_sp2_ptp_txhdr_construct(struct mlxsw_core *mlxsw_core, 237 struct mlxsw_sp_port *mlxsw_sp_port, 238 struct sk_buff *skb, 239 const struct mlxsw_tx_info *tx_info) 240{ 241 return -EOPNOTSUPP; 242} 243#endif 244 245static inline void mlxsw_sp2_ptp_shaper_work(struct work_struct *work) 246{ 247} 248 249static inline int mlxsw_sp2_get_stats_count(void) 250{ 251 return 0; 252} 253 254static inline void mlxsw_sp2_get_stats_strings(u8 **p) 255{ 256} 257 258static inline void mlxsw_sp2_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, 259 u64 *data, int data_index) 260{ 261} 262 263#endif 264