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