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 10 struct mlxsw_sp; 11 struct mlxsw_sp_port; 12 struct mlxsw_sp_ptp_clock; 13 14 static 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 24 struct mlxsw_sp_ptp_clock * 25 mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev); 26 27 void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock); 28 29 struct mlxsw_sp_ptp_state *mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp); 30 31 void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state); 32 33 void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, 34 u16 local_port); 35 36 void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 37 struct sk_buff *skb, u16 local_port); 38 39 void 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 44 int mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 45 struct hwtstamp_config *config); 46 47 int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 48 struct hwtstamp_config *config); 49 50 void mlxsw_sp1_ptp_shaper_work(struct work_struct *work); 51 52 int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 53 struct ethtool_ts_info *info); 54 55 int mlxsw_sp1_get_stats_count(void); 56 void mlxsw_sp1_get_stats_strings(u8 **p); 57 void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, 58 u64 *data, int data_index); 59 60 int 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 65 struct mlxsw_sp_ptp_clock * 66 mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev); 67 68 void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock); 69 70 struct mlxsw_sp_ptp_state *mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp); 71 72 void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state); 73 74 void mlxsw_sp2_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, 75 u16 local_port); 76 77 void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 78 struct sk_buff *skb, u16 local_port); 79 80 int mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 81 struct hwtstamp_config *config); 82 83 int mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 84 struct hwtstamp_config *config); 85 86 int mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 87 struct ethtool_ts_info *info); 88 89 int 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 96 static inline struct mlxsw_sp_ptp_clock * 97 mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev) 98 { 99 return NULL; 100 } 101 102 static inline void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock) 103 { 104 } 105 106 static inline struct mlxsw_sp_ptp_state * 107 mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp) 108 { 109 return NULL; 110 } 111 112 static inline void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state) 113 { 114 } 115 116 static 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 122 static 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 128 static inline void 129 mlxsw_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 136 static inline int 137 mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 138 struct hwtstamp_config *config) 139 { 140 return -EOPNOTSUPP; 141 } 142 143 static inline int 144 mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 145 struct hwtstamp_config *config) 146 { 147 return -EOPNOTSUPP; 148 } 149 150 static inline void mlxsw_sp1_ptp_shaper_work(struct work_struct *work) 151 { 152 } 153 154 static 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 160 static inline int mlxsw_sp1_get_stats_count(void) 161 { 162 return 0; 163 } 164 165 static inline void mlxsw_sp1_get_stats_strings(u8 **p) 166 { 167 } 168 169 static inline void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, 170 u64 *data, int data_index) 171 { 172 } 173 174 static inline int 175 mlxsw_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 183 static inline struct mlxsw_sp_ptp_clock * 184 mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev) 185 { 186 return NULL; 187 } 188 189 static inline void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock) 190 { 191 } 192 193 static inline struct mlxsw_sp_ptp_state * 194 mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp) 195 { 196 return NULL; 197 } 198 199 static inline void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state) 200 { 201 } 202 203 static 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 209 static 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 215 static inline int 216 mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 217 struct hwtstamp_config *config) 218 { 219 return -EOPNOTSUPP; 220 } 221 222 static inline int 223 mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 224 struct hwtstamp_config *config) 225 { 226 return -EOPNOTSUPP; 227 } 228 229 static 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 235 static inline int 236 mlxsw_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 245 static inline void mlxsw_sp2_ptp_shaper_work(struct work_struct *work) 246 { 247 } 248 249 static inline int mlxsw_sp2_get_stats_count(void) 250 { 251 return 0; 252 } 253 254 static inline void mlxsw_sp2_get_stats_strings(u8 **p) 255 { 256 } 257 258 static 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