Merge branch 'for-v5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ebieder...
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlxsw / spectrum_ptp.h
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