1
2
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 u8 local_port);
35
36void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
37 struct sk_buff *skb, u8 local_port);
38
39void 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
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
60#else
61
62static inline struct mlxsw_sp_ptp_clock *
63mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev)
64{
65 return NULL;
66}
67
68static inline void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock)
69{
70}
71
72static inline struct mlxsw_sp_ptp_state *
73mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp)
74{
75 return NULL;
76}
77
78static inline void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state)
79{
80}
81
82static 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
88static 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
94static inline void
95mlxsw_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
102static inline int
103mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
104 struct hwtstamp_config *config)
105{
106 return -EOPNOTSUPP;
107}
108
109static inline int
110mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
111 struct hwtstamp_config *config)
112{
113 return -EOPNOTSUPP;
114}
115
116static inline void mlxsw_sp1_ptp_shaper_work(struct work_struct *work)
117{
118}
119
120static 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
126static inline int mlxsw_sp1_get_stats_count(void)
127{
128 return 0;
129}
130
131static inline void mlxsw_sp1_get_stats_strings(u8 **p)
132{
133}
134
135static inline void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port,
136 u64 *data, int data_index)
137{
138}
139#endif
140
141static inline struct mlxsw_sp_ptp_clock *
142mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev)
143{
144 return NULL;
145}
146
147static inline void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock)
148{
149}
150
151static inline struct mlxsw_sp_ptp_state *
152mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp)
153{
154 return NULL;
155}
156
157static inline void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state)
158{
159}
160
161static 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
167static 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
173static inline int
174mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
175 struct hwtstamp_config *config)
176{
177 return -EOPNOTSUPP;
178}
179
180static inline int
181mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
182 struct hwtstamp_config *config)
183{
184 return -EOPNOTSUPP;
185}
186
187static inline void mlxsw_sp2_ptp_shaper_work(struct work_struct *work)
188{
189}
190
191static 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
197static inline int mlxsw_sp2_get_stats_count(void)
198{
199 return 0;
200}
201
202static inline void mlxsw_sp2_get_stats_strings(u8 **p)
203{
204}
205
206static 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