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