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 enum { 15 MLXSW_SP_PTP_MESSAGE_TYPE_SYNC, 16 MLXSW_SP_PTP_MESSAGE_TYPE_DELAY_REQ, 17 MLXSW_SP_PTP_MESSAGE_TYPE_PDELAY_REQ, 18 MLXSW_SP_PTP_MESSAGE_TYPE_PDELAY_RESP, 19 }; 20 21 static inline int mlxsw_sp_ptp_get_ts_info_noptp(struct ethtool_ts_info *info) 22 { 23 info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE | 24 SOF_TIMESTAMPING_SOFTWARE; 25 info->phc_index = -1; 26 return 0; 27 } 28 29 #if IS_REACHABLE(CONFIG_PTP_1588_CLOCK) 30 31 struct mlxsw_sp_ptp_clock * 32 mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev); 33 34 void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock); 35 36 struct mlxsw_sp_ptp_state *mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp); 37 38 void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state); 39 40 void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, 41 u8 local_port); 42 43 void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 44 struct sk_buff *skb, u8 local_port); 45 46 void mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress, 47 u8 local_port, u8 message_type, 48 u8 domain_number, u16 sequence_id, 49 u64 timestamp); 50 51 int mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 52 struct hwtstamp_config *config); 53 54 int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 55 struct hwtstamp_config *config); 56 57 void mlxsw_sp1_ptp_shaper_work(struct work_struct *work); 58 59 int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 60 struct ethtool_ts_info *info); 61 62 int mlxsw_sp1_get_stats_count(void); 63 void mlxsw_sp1_get_stats_strings(u8 **p); 64 void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, 65 u64 *data, int data_index); 66 67 #else 68 69 static inline struct mlxsw_sp_ptp_clock * 70 mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev) 71 { 72 return NULL; 73 } 74 75 static inline void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock) 76 { 77 } 78 79 static inline struct mlxsw_sp_ptp_state * 80 mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp) 81 { 82 return NULL; 83 } 84 85 static inline void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state) 86 { 87 } 88 89 static inline void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, 90 struct sk_buff *skb, u8 local_port) 91 { 92 mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp); 93 } 94 95 static inline void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 96 struct sk_buff *skb, u8 local_port) 97 { 98 dev_kfree_skb_any(skb); 99 } 100 101 static inline void 102 mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress, 103 u8 local_port, u8 message_type, 104 u8 domain_number, 105 u16 sequence_id, u64 timestamp) 106 { 107 } 108 109 static inline int 110 mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 111 struct hwtstamp_config *config) 112 { 113 return -EOPNOTSUPP; 114 } 115 116 static inline int 117 mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 118 struct hwtstamp_config *config) 119 { 120 return -EOPNOTSUPP; 121 } 122 123 static inline void mlxsw_sp1_ptp_shaper_work(struct work_struct *work) 124 { 125 } 126 127 static inline int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 128 struct ethtool_ts_info *info) 129 { 130 return mlxsw_sp_ptp_get_ts_info_noptp(info); 131 } 132 133 static inline int mlxsw_sp1_get_stats_count(void) 134 { 135 return 0; 136 } 137 138 static inline void mlxsw_sp1_get_stats_strings(u8 **p) 139 { 140 } 141 142 static inline void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, 143 u64 *data, int data_index) 144 { 145 } 146 #endif 147 148 static inline struct mlxsw_sp_ptp_clock * 149 mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev) 150 { 151 return NULL; 152 } 153 154 static inline void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock) 155 { 156 } 157 158 static inline struct mlxsw_sp_ptp_state * 159 mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp) 160 { 161 return NULL; 162 } 163 164 static inline void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state) 165 { 166 } 167 168 static inline void mlxsw_sp2_ptp_receive(struct mlxsw_sp *mlxsw_sp, 169 struct sk_buff *skb, u8 local_port) 170 { 171 mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp); 172 } 173 174 static inline void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp, 175 struct sk_buff *skb, u8 local_port) 176 { 177 dev_kfree_skb_any(skb); 178 } 179 180 static inline int 181 mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port, 182 struct hwtstamp_config *config) 183 { 184 return -EOPNOTSUPP; 185 } 186 187 static inline int 188 mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port, 189 struct hwtstamp_config *config) 190 { 191 return -EOPNOTSUPP; 192 } 193 194 static inline void mlxsw_sp2_ptp_shaper_work(struct work_struct *work) 195 { 196 } 197 198 static inline int mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp, 199 struct ethtool_ts_info *info) 200 { 201 return mlxsw_sp_ptp_get_ts_info_noptp(info); 202 } 203 204 static inline int mlxsw_sp2_get_stats_count(void) 205 { 206 return 0; 207 } 208 209 static inline void mlxsw_sp2_get_stats_strings(u8 **p) 210 { 211 } 212 213 static inline void mlxsw_sp2_get_stats(struct mlxsw_sp_port *mlxsw_sp_port, 214 u64 *data, int data_index) 215 { 216 } 217 218 #endif 219