This source file includes following definitions.
- efx_ptp_use_mac_tx_timestamps
- efx_ptp_want_txqs
- efx_ptp_describe_stats
- efx_ptp_update_stats
- efx_ptp_ns_to_s_ns
- efx_ptp_s_ns_to_ktime_correction
- efx_ptp_ns_to_s27
- efx_ptp_s27_to_ktime
- efx_ptp_s27_to_ktime_correction
- efx_ptp_ns_to_s_qns
- efx_ptp_s_qns_to_ktime_correction
- efx_ptp_channel
- last_sync_timestamp_major
- efx_ptp_mac_nic_to_ktime_correction
- efx_ptp_nic_to_kernel_time
- efx_ptp_get_attributes
- efx_ptp_get_timestamp_corrections
- efx_ptp_enable
- efx_ptp_disable
- efx_ptp_deliver_rx_queue
- efx_ptp_handle_no_channel
- efx_ptp_send_times
- efx_ptp_read_timeset
- efx_ptp_process_times
- efx_ptp_synchronize
- efx_ptp_xmit_skb_queue
- efx_ptp_xmit_skb_mc
- efx_ptp_drop_time_expired_events
- efx_ptp_match_rx
- efx_ptp_process_events
- efx_ptp_process_rx
- efx_ptp_remove_multicast_filters
- efx_ptp_insert_multicast_filters
- efx_ptp_start
- efx_ptp_stop
- efx_ptp_restart
- efx_ptp_pps_worker
- efx_ptp_worker
- efx_ptp_probe
- efx_ptp_probe_channel
- efx_ptp_remove
- efx_ptp_remove_channel
- efx_ptp_get_channel_name
- efx_ptp_is_ptp_tx
- efx_ptp_rx
- efx_ptp_tx
- efx_ptp_get_mode
- efx_ptp_change_mode
- efx_ptp_ts_init
- efx_ptp_get_ts_info
- efx_ptp_set_ts_config
- efx_ptp_get_ts_config
- ptp_event_failure
- ptp_event_rx
- ptp_event_fault
- ptp_event_pps
- efx_ptp_event
- efx_time_sync_event
- efx_rx_buf_timestamp_minor
- __efx_rx_skb_attach_timestamp
- efx_phc_adjfreq
- efx_phc_adjtime
- efx_phc_gettime
- efx_phc_settime
- efx_phc_enable
- efx_ptp_defer_probe_with_channel
- efx_ptp_start_datapath
- efx_ptp_stop_datapath
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #include <linux/ip.h>
34 #include <linux/udp.h>
35 #include <linux/time.h>
36 #include <linux/ktime.h>
37 #include <linux/module.h>
38 #include <linux/net_tstamp.h>
39 #include <linux/pps_kernel.h>
40 #include <linux/ptp_clock_kernel.h>
41 #include "net_driver.h"
42 #include "efx.h"
43 #include "mcdi.h"
44 #include "mcdi_pcol.h"
45 #include "io.h"
46 #include "farch_regs.h"
47 #include "nic.h"
48
49
50 #define MAX_EVENT_FRAGS 3
51
52
53 #define MAX_SYNCHRONISE_WAIT_MS 2
54
55
56 #define SYNCHRONISE_PERIOD_NS 250000
57
58
59 #define SYNCHRONISATION_GRANULARITY_NS 200
60
61
62 #define DEFAULT_MIN_SYNCHRONISATION_NS 120
63
64
65 #define MAX_SYNCHRONISATION_NS 1000
66
67
68 #define MAX_RECEIVE_EVENTS 8
69
70
71 #define AVERAGE_LENGTH 16
72
73
74 #define PKT_EVENT_LIFETIME_MS 10
75
76
77
78
79
80 #define PTP_DPORT_OFFSET 22
81
82 #define PTP_V1_VERSION_LENGTH 2
83 #define PTP_V1_VERSION_OFFSET 28
84
85 #define PTP_V1_UUID_LENGTH 6
86 #define PTP_V1_UUID_OFFSET 50
87
88 #define PTP_V1_SEQUENCE_LENGTH 2
89 #define PTP_V1_SEQUENCE_OFFSET 58
90
91
92
93
94 #define PTP_V1_MIN_LENGTH 64
95
96 #define PTP_V2_VERSION_LENGTH 1
97 #define PTP_V2_VERSION_OFFSET 29
98
99 #define PTP_V2_UUID_LENGTH 8
100 #define PTP_V2_UUID_OFFSET 48
101
102
103
104
105
106
107 #define PTP_V2_MC_UUID_LENGTH 6
108 #define PTP_V2_MC_UUID_OFFSET 50
109
110 #define PTP_V2_SEQUENCE_LENGTH 2
111 #define PTP_V2_SEQUENCE_OFFSET 58
112
113
114
115
116 #define PTP_V2_MIN_LENGTH 63
117
118 #define PTP_MIN_LENGTH 63
119
120 #define PTP_ADDRESS 0xe0000181
121 #define PTP_EVENT_PORT 319
122 #define PTP_GENERAL_PORT 320
123
124
125
126
127 #define PTP_VERSION_V1 1
128
129 #define PTP_VERSION_V2 2
130 #define PTP_VERSION_V2_MASK 0x0f
131
132 enum ptp_packet_state {
133 PTP_PACKET_STATE_UNMATCHED = 0,
134 PTP_PACKET_STATE_MATCHED,
135 PTP_PACKET_STATE_TIMED_OUT,
136 PTP_PACKET_STATE_MATCH_UNWANTED
137 };
138
139
140
141
142 #define MC_NANOSECOND_BITS 30
143 #define MC_NANOSECOND_MASK ((1 << MC_NANOSECOND_BITS) - 1)
144 #define MC_SECOND_MASK ((1 << (32 - MC_NANOSECOND_BITS)) - 1)
145
146
147 #define MAX_PPB 1000000
148
149
150
151 #define PPB_SCALE_WORD ((1LL << (57)) / 1953125LL)
152
153
154 #define PPB_SHIFT_FP40 26
155
156 #define PPB_SHIFT_FP44 22
157
158 #define PTP_SYNC_ATTEMPTS 4
159
160
161
162
163
164
165
166
167
168 struct efx_ptp_match {
169 u32 words[DIV_ROUND_UP(PTP_V1_UUID_LENGTH, 4)];
170 unsigned long expiry;
171 enum ptp_packet_state state;
172 };
173
174
175
176
177
178
179
180 struct efx_ptp_event_rx {
181 struct list_head link;
182 u32 seq0;
183 u32 seq1;
184 ktime_t hwtimestamp;
185 unsigned long expiry;
186 };
187
188
189
190
191
192
193
194
195
196
197
198
199 struct efx_ptp_timeset {
200 u32 host_start;
201 u32 major;
202 u32 minor;
203 u32 host_end;
204 u32 wait;
205 u32 window;
206 };
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279 struct efx_ptp_data {
280 struct efx_nic *efx;
281 struct efx_channel *channel;
282 bool rx_ts_inline;
283 struct sk_buff_head rxq;
284 struct sk_buff_head txq;
285 struct list_head evt_list;
286 struct list_head evt_free_list;
287 spinlock_t evt_lock;
288 struct efx_ptp_event_rx rx_evts[MAX_RECEIVE_EVENTS];
289 struct workqueue_struct *workwq;
290 struct work_struct work;
291 bool reset_required;
292 u32 rxfilter_event;
293 u32 rxfilter_general;
294 bool rxfilter_installed;
295 struct hwtstamp_config config;
296 bool enabled;
297 unsigned int mode;
298 void (*ns_to_nic_time)(s64 ns, u32 *nic_major, u32 *nic_minor);
299 ktime_t (*nic_to_kernel_time)(u32 nic_major, u32 nic_minor,
300 s32 correction);
301 struct {
302 u32 minor_max;
303 u32 sync_event_diff_min;
304 u32 sync_event_diff_max;
305 unsigned int sync_event_minor_shift;
306 } nic_time;
307 unsigned int min_synchronisation_ns;
308 unsigned int capabilities;
309 struct {
310 s32 ptp_tx;
311 s32 ptp_rx;
312 s32 pps_out;
313 s32 pps_in;
314 s32 general_tx;
315 s32 general_rx;
316 } ts_corrections;
317 efx_qword_t evt_frags[MAX_EVENT_FRAGS];
318 int evt_frag_idx;
319 int evt_code;
320 struct efx_buffer start;
321 struct pps_event_time host_time_pps;
322 unsigned int adjfreq_ppb_shift;
323 s64 current_adjfreq;
324 struct ptp_clock *phc_clock;
325 struct ptp_clock_info phc_clock_info;
326 struct work_struct pps_work;
327 struct workqueue_struct *pps_workwq;
328 bool nic_ts_enabled;
329 _MCDI_DECLARE_BUF(txbuf, MC_CMD_PTP_IN_TRANSMIT_LENMAX);
330
331 unsigned int good_syncs;
332 unsigned int fast_syncs;
333 unsigned int bad_syncs;
334 unsigned int sync_timeouts;
335 unsigned int no_time_syncs;
336 unsigned int invalid_sync_windows;
337 unsigned int undersize_sync_windows;
338 unsigned int oversize_sync_windows;
339 unsigned int rx_no_timestamp;
340 struct efx_ptp_timeset
341 timeset[MC_CMD_PTP_OUT_SYNCHRONIZE_TIMESET_MAXNUM];
342 void (*xmit_skb)(struct efx_nic *efx, struct sk_buff *skb);
343 };
344
345 static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta);
346 static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta);
347 static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts);
348 static int efx_phc_settime(struct ptp_clock_info *ptp,
349 const struct timespec64 *e_ts);
350 static int efx_phc_enable(struct ptp_clock_info *ptp,
351 struct ptp_clock_request *request, int on);
352
353 bool efx_ptp_use_mac_tx_timestamps(struct efx_nic *efx)
354 {
355 struct efx_ef10_nic_data *nic_data = efx->nic_data;
356
357 return ((efx_nic_rev(efx) >= EFX_REV_HUNT_A0) &&
358 (nic_data->datapath_caps2 &
359 (1 << MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_LBN)
360 ));
361 }
362
363
364
365
366 static bool efx_ptp_want_txqs(struct efx_channel *channel)
367 {
368 return efx_ptp_use_mac_tx_timestamps(channel->efx);
369 }
370
371 #define PTP_SW_STAT(ext_name, field_name) \
372 { #ext_name, 0, offsetof(struct efx_ptp_data, field_name) }
373 #define PTP_MC_STAT(ext_name, mcdi_name) \
374 { #ext_name, 32, MC_CMD_PTP_OUT_STATUS_STATS_ ## mcdi_name ## _OFST }
375 static const struct efx_hw_stat_desc efx_ptp_stat_desc[] = {
376 PTP_SW_STAT(ptp_good_syncs, good_syncs),
377 PTP_SW_STAT(ptp_fast_syncs, fast_syncs),
378 PTP_SW_STAT(ptp_bad_syncs, bad_syncs),
379 PTP_SW_STAT(ptp_sync_timeouts, sync_timeouts),
380 PTP_SW_STAT(ptp_no_time_syncs, no_time_syncs),
381 PTP_SW_STAT(ptp_invalid_sync_windows, invalid_sync_windows),
382 PTP_SW_STAT(ptp_undersize_sync_windows, undersize_sync_windows),
383 PTP_SW_STAT(ptp_oversize_sync_windows, oversize_sync_windows),
384 PTP_SW_STAT(ptp_rx_no_timestamp, rx_no_timestamp),
385 PTP_MC_STAT(ptp_tx_timestamp_packets, TX),
386 PTP_MC_STAT(ptp_rx_timestamp_packets, RX),
387 PTP_MC_STAT(ptp_timestamp_packets, TS),
388 PTP_MC_STAT(ptp_filter_matches, FM),
389 PTP_MC_STAT(ptp_non_filter_matches, NFM),
390 };
391 #define PTP_STAT_COUNT ARRAY_SIZE(efx_ptp_stat_desc)
392 static const unsigned long efx_ptp_stat_mask[] = {
393 [0 ... BITS_TO_LONGS(PTP_STAT_COUNT) - 1] = ~0UL,
394 };
395
396 size_t efx_ptp_describe_stats(struct efx_nic *efx, u8 *strings)
397 {
398 if (!efx->ptp_data)
399 return 0;
400
401 return efx_nic_describe_stats(efx_ptp_stat_desc, PTP_STAT_COUNT,
402 efx_ptp_stat_mask, strings);
403 }
404
405 size_t efx_ptp_update_stats(struct efx_nic *efx, u64 *stats)
406 {
407 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_STATUS_LEN);
408 MCDI_DECLARE_BUF(outbuf, MC_CMD_PTP_OUT_STATUS_LEN);
409 size_t i;
410 int rc;
411
412 if (!efx->ptp_data)
413 return 0;
414
415
416 for (i = 0; i < PTP_STAT_COUNT; i++) {
417 if (efx_ptp_stat_desc[i].dma_width)
418 continue;
419 stats[i] = *(unsigned int *)((char *)efx->ptp_data +
420 efx_ptp_stat_desc[i].offset);
421 }
422
423
424
425
426
427 MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_STATUS);
428 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);
429 rc = efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf),
430 outbuf, sizeof(outbuf), NULL);
431 if (rc)
432 memset(outbuf, 0, sizeof(outbuf));
433 efx_nic_update_stats(efx_ptp_stat_desc, PTP_STAT_COUNT,
434 efx_ptp_stat_mask,
435 stats, _MCDI_PTR(outbuf, 0), false);
436
437 return PTP_STAT_COUNT;
438 }
439
440
441 static void efx_ptp_ns_to_s_ns(s64 ns, u32 *nic_major, u32 *nic_minor)
442 {
443 struct timespec64 ts = ns_to_timespec64(ns);
444 *nic_major = (u32)ts.tv_sec;
445 *nic_minor = ts.tv_nsec;
446 }
447
448 static ktime_t efx_ptp_s_ns_to_ktime_correction(u32 nic_major, u32 nic_minor,
449 s32 correction)
450 {
451 ktime_t kt = ktime_set(nic_major, nic_minor);
452 if (correction >= 0)
453 kt = ktime_add_ns(kt, (u64)correction);
454 else
455 kt = ktime_sub_ns(kt, (u64)-correction);
456 return kt;
457 }
458
459
460
461
462
463 #define S27_TO_NS_SHIFT (27)
464 #define NS_TO_S27_MULT (((1ULL << 63) + NSEC_PER_SEC / 2) / NSEC_PER_SEC)
465 #define NS_TO_S27_SHIFT (63 - S27_TO_NS_SHIFT)
466 #define S27_MINOR_MAX (1 << S27_TO_NS_SHIFT)
467
468
469
470
471 static void efx_ptp_ns_to_s27(s64 ns, u32 *nic_major, u32 *nic_minor)
472 {
473 struct timespec64 ts = ns_to_timespec64(ns);
474 u32 maj = (u32)ts.tv_sec;
475 u32 min = (u32)(((u64)ts.tv_nsec * NS_TO_S27_MULT +
476 (1ULL << (NS_TO_S27_SHIFT - 1))) >> NS_TO_S27_SHIFT);
477
478
479
480
481 if (min >= S27_MINOR_MAX) {
482 min -= S27_MINOR_MAX;
483 maj++;
484 }
485
486 *nic_major = maj;
487 *nic_minor = min;
488 }
489
490 static inline ktime_t efx_ptp_s27_to_ktime(u32 nic_major, u32 nic_minor)
491 {
492 u32 ns = (u32)(((u64)nic_minor * NSEC_PER_SEC +
493 (1ULL << (S27_TO_NS_SHIFT - 1))) >> S27_TO_NS_SHIFT);
494 return ktime_set(nic_major, ns);
495 }
496
497 static ktime_t efx_ptp_s27_to_ktime_correction(u32 nic_major, u32 nic_minor,
498 s32 correction)
499 {
500
501 nic_minor += correction;
502 if ((s32)nic_minor < 0) {
503 nic_minor += S27_MINOR_MAX;
504 nic_major--;
505 } else if (nic_minor >= S27_MINOR_MAX) {
506 nic_minor -= S27_MINOR_MAX;
507 nic_major++;
508 }
509
510 return efx_ptp_s27_to_ktime(nic_major, nic_minor);
511 }
512
513
514 static void efx_ptp_ns_to_s_qns(s64 ns, u32 *nic_major, u32 *nic_minor)
515 {
516 struct timespec64 ts = ns_to_timespec64(ns);
517
518 *nic_major = (u32)ts.tv_sec;
519 *nic_minor = ts.tv_nsec * 4;
520 }
521
522 static ktime_t efx_ptp_s_qns_to_ktime_correction(u32 nic_major, u32 nic_minor,
523 s32 correction)
524 {
525 ktime_t kt;
526
527 nic_minor = DIV_ROUND_CLOSEST(nic_minor, 4);
528 correction = DIV_ROUND_CLOSEST(correction, 4);
529
530 kt = ktime_set(nic_major, nic_minor);
531
532 if (correction >= 0)
533 kt = ktime_add_ns(kt, (u64)correction);
534 else
535 kt = ktime_sub_ns(kt, (u64)-correction);
536 return kt;
537 }
538
539 struct efx_channel *efx_ptp_channel(struct efx_nic *efx)
540 {
541 return efx->ptp_data ? efx->ptp_data->channel : NULL;
542 }
543
544 static u32 last_sync_timestamp_major(struct efx_nic *efx)
545 {
546 struct efx_channel *channel = efx_ptp_channel(efx);
547 u32 major = 0;
548
549 if (channel)
550 major = channel->sync_timestamp_major;
551 return major;
552 }
553
554
555
556
557 static ktime_t
558 efx_ptp_mac_nic_to_ktime_correction(struct efx_nic *efx,
559 struct efx_ptp_data *ptp,
560 u32 nic_major, u32 nic_minor,
561 s32 correction)
562 {
563 u32 sync_timestamp;
564 ktime_t kt = { 0 };
565 s16 delta;
566
567 if (!(nic_major & 0x80000000)) {
568 WARN_ON_ONCE(nic_major >> 16);
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588 sync_timestamp = last_sync_timestamp_major(efx);
589
590
591
592
593
594
595
596 delta = nic_major - sync_timestamp;
597
598
599
600
601 nic_major = sync_timestamp + delta;
602
603 kt = ptp->nic_to_kernel_time(nic_major, nic_minor,
604 correction);
605 }
606 return kt;
607 }
608
609 ktime_t efx_ptp_nic_to_kernel_time(struct efx_tx_queue *tx_queue)
610 {
611 struct efx_nic *efx = tx_queue->efx;
612 struct efx_ptp_data *ptp = efx->ptp_data;
613 ktime_t kt;
614
615 if (efx_ptp_use_mac_tx_timestamps(efx))
616 kt = efx_ptp_mac_nic_to_ktime_correction(efx, ptp,
617 tx_queue->completed_timestamp_major,
618 tx_queue->completed_timestamp_minor,
619 ptp->ts_corrections.general_tx);
620 else
621 kt = ptp->nic_to_kernel_time(
622 tx_queue->completed_timestamp_major,
623 tx_queue->completed_timestamp_minor,
624 ptp->ts_corrections.general_tx);
625 return kt;
626 }
627
628
629 static int efx_ptp_get_attributes(struct efx_nic *efx)
630 {
631 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_GET_ATTRIBUTES_LEN);
632 MCDI_DECLARE_BUF(outbuf, MC_CMD_PTP_OUT_GET_ATTRIBUTES_LEN);
633 struct efx_ptp_data *ptp = efx->ptp_data;
634 int rc;
635 u32 fmt;
636 size_t out_len;
637
638
639
640
641
642 MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_GET_ATTRIBUTES);
643 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);
644 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_PTP, inbuf, sizeof(inbuf),
645 outbuf, sizeof(outbuf), &out_len);
646 if (rc == 0) {
647 fmt = MCDI_DWORD(outbuf, PTP_OUT_GET_ATTRIBUTES_TIME_FORMAT);
648 } else if (rc == -EINVAL) {
649 fmt = MC_CMD_PTP_OUT_GET_ATTRIBUTES_SECONDS_NANOSECONDS;
650 } else if (rc == -EPERM) {
651 netif_info(efx, probe, efx->net_dev, "no PTP support\n");
652 return rc;
653 } else {
654 efx_mcdi_display_error(efx, MC_CMD_PTP, sizeof(inbuf),
655 outbuf, sizeof(outbuf), rc);
656 return rc;
657 }
658
659 switch (fmt) {
660 case MC_CMD_PTP_OUT_GET_ATTRIBUTES_SECONDS_27FRACTION:
661 ptp->ns_to_nic_time = efx_ptp_ns_to_s27;
662 ptp->nic_to_kernel_time = efx_ptp_s27_to_ktime_correction;
663 ptp->nic_time.minor_max = 1 << 27;
664 ptp->nic_time.sync_event_minor_shift = 19;
665 break;
666 case MC_CMD_PTP_OUT_GET_ATTRIBUTES_SECONDS_NANOSECONDS:
667 ptp->ns_to_nic_time = efx_ptp_ns_to_s_ns;
668 ptp->nic_to_kernel_time = efx_ptp_s_ns_to_ktime_correction;
669 ptp->nic_time.minor_max = 1000000000;
670 ptp->nic_time.sync_event_minor_shift = 22;
671 break;
672 case MC_CMD_PTP_OUT_GET_ATTRIBUTES_SECONDS_QTR_NANOSECONDS:
673 ptp->ns_to_nic_time = efx_ptp_ns_to_s_qns;
674 ptp->nic_to_kernel_time = efx_ptp_s_qns_to_ktime_correction;
675 ptp->nic_time.minor_max = 4000000000UL;
676 ptp->nic_time.sync_event_minor_shift = 24;
677 break;
678 default:
679 return -ERANGE;
680 }
681
682
683
684
685
686
687
688 ptp->nic_time.sync_event_diff_min = ptp->nic_time.minor_max
689 - (ptp->nic_time.minor_max / 10);
690 ptp->nic_time.sync_event_diff_max = (ptp->nic_time.minor_max / 4)
691 + (ptp->nic_time.minor_max / 10);
692
693
694
695
696
697
698
699
700 if (rc == 0 &&
701 out_len >= MC_CMD_PTP_OUT_GET_ATTRIBUTES_CAPABILITIES_OFST)
702 ptp->min_synchronisation_ns =
703 MCDI_DWORD(outbuf,
704 PTP_OUT_GET_ATTRIBUTES_SYNC_WINDOW_MIN);
705 else
706 ptp->min_synchronisation_ns = DEFAULT_MIN_SYNCHRONISATION_NS;
707
708 if (rc == 0 &&
709 out_len >= MC_CMD_PTP_OUT_GET_ATTRIBUTES_LEN)
710 ptp->capabilities = MCDI_DWORD(outbuf,
711 PTP_OUT_GET_ATTRIBUTES_CAPABILITIES);
712 else
713 ptp->capabilities = 0;
714
715
716
717
718
719 if (ptp->capabilities & (1 << MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_LBN))
720 ptp->adjfreq_ppb_shift = PPB_SHIFT_FP44;
721 else
722 ptp->adjfreq_ppb_shift = PPB_SHIFT_FP40;
723
724 return 0;
725 }
726
727
728 static int efx_ptp_get_timestamp_corrections(struct efx_nic *efx)
729 {
730 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_GET_TIMESTAMP_CORRECTIONS_LEN);
731 MCDI_DECLARE_BUF(outbuf, MC_CMD_PTP_OUT_GET_TIMESTAMP_CORRECTIONS_V2_LEN);
732 int rc;
733 size_t out_len;
734
735
736
737
738 MCDI_SET_DWORD(inbuf, PTP_IN_OP,
739 MC_CMD_PTP_OP_GET_TIMESTAMP_CORRECTIONS);
740 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);
741
742 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_PTP, inbuf, sizeof(inbuf),
743 outbuf, sizeof(outbuf), &out_len);
744 if (rc == 0) {
745 efx->ptp_data->ts_corrections.ptp_tx = MCDI_DWORD(outbuf,
746 PTP_OUT_GET_TIMESTAMP_CORRECTIONS_TRANSMIT);
747 efx->ptp_data->ts_corrections.ptp_rx = MCDI_DWORD(outbuf,
748 PTP_OUT_GET_TIMESTAMP_CORRECTIONS_RECEIVE);
749 efx->ptp_data->ts_corrections.pps_out = MCDI_DWORD(outbuf,
750 PTP_OUT_GET_TIMESTAMP_CORRECTIONS_PPS_OUT);
751 efx->ptp_data->ts_corrections.pps_in = MCDI_DWORD(outbuf,
752 PTP_OUT_GET_TIMESTAMP_CORRECTIONS_PPS_IN);
753
754 if (out_len >= MC_CMD_PTP_OUT_GET_TIMESTAMP_CORRECTIONS_V2_LEN) {
755 efx->ptp_data->ts_corrections.general_tx = MCDI_DWORD(
756 outbuf,
757 PTP_OUT_GET_TIMESTAMP_CORRECTIONS_V2_GENERAL_TX);
758 efx->ptp_data->ts_corrections.general_rx = MCDI_DWORD(
759 outbuf,
760 PTP_OUT_GET_TIMESTAMP_CORRECTIONS_V2_GENERAL_RX);
761 } else {
762 efx->ptp_data->ts_corrections.general_tx =
763 efx->ptp_data->ts_corrections.ptp_tx;
764 efx->ptp_data->ts_corrections.general_rx =
765 efx->ptp_data->ts_corrections.ptp_rx;
766 }
767 } else if (rc == -EINVAL) {
768 efx->ptp_data->ts_corrections.ptp_tx = 0;
769 efx->ptp_data->ts_corrections.ptp_rx = 0;
770 efx->ptp_data->ts_corrections.pps_out = 0;
771 efx->ptp_data->ts_corrections.pps_in = 0;
772 efx->ptp_data->ts_corrections.general_tx = 0;
773 efx->ptp_data->ts_corrections.general_rx = 0;
774 } else {
775 efx_mcdi_display_error(efx, MC_CMD_PTP, sizeof(inbuf), outbuf,
776 sizeof(outbuf), rc);
777 return rc;
778 }
779
780 return 0;
781 }
782
783
784 static int efx_ptp_enable(struct efx_nic *efx)
785 {
786 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_ENABLE_LEN);
787 MCDI_DECLARE_BUF_ERR(outbuf);
788 int rc;
789
790 MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_ENABLE);
791 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);
792 MCDI_SET_DWORD(inbuf, PTP_IN_ENABLE_QUEUE,
793 efx->ptp_data->channel ?
794 efx->ptp_data->channel->channel : 0);
795 MCDI_SET_DWORD(inbuf, PTP_IN_ENABLE_MODE, efx->ptp_data->mode);
796
797 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_PTP, inbuf, sizeof(inbuf),
798 outbuf, sizeof(outbuf), NULL);
799 rc = (rc == -EALREADY) ? 0 : rc;
800 if (rc)
801 efx_mcdi_display_error(efx, MC_CMD_PTP,
802 MC_CMD_PTP_IN_ENABLE_LEN,
803 outbuf, sizeof(outbuf), rc);
804 return rc;
805 }
806
807
808
809
810
811
812 static int efx_ptp_disable(struct efx_nic *efx)
813 {
814 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_DISABLE_LEN);
815 MCDI_DECLARE_BUF_ERR(outbuf);
816 int rc;
817
818 MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_DISABLE);
819 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);
820 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_PTP, inbuf, sizeof(inbuf),
821 outbuf, sizeof(outbuf), NULL);
822 rc = (rc == -EALREADY) ? 0 : rc;
823
824
825
826 if (rc == -ENOSYS || rc == -EPERM)
827 netif_info(efx, probe, efx->net_dev, "no PTP support\n");
828 else if (rc)
829 efx_mcdi_display_error(efx, MC_CMD_PTP,
830 MC_CMD_PTP_IN_DISABLE_LEN,
831 outbuf, sizeof(outbuf), rc);
832 return rc;
833 }
834
835 static void efx_ptp_deliver_rx_queue(struct sk_buff_head *q)
836 {
837 struct sk_buff *skb;
838
839 while ((skb = skb_dequeue(q))) {
840 local_bh_disable();
841 netif_receive_skb(skb);
842 local_bh_enable();
843 }
844 }
845
846 static void efx_ptp_handle_no_channel(struct efx_nic *efx)
847 {
848 netif_err(efx, drv, efx->net_dev,
849 "ERROR: PTP requires MSI-X and 1 additional interrupt"
850 "vector. PTP disabled\n");
851 }
852
853
854
855
856 static void efx_ptp_send_times(struct efx_nic *efx,
857 struct pps_event_time *last_time)
858 {
859 struct pps_event_time now;
860 struct timespec64 limit;
861 struct efx_ptp_data *ptp = efx->ptp_data;
862 int *mc_running = ptp->start.addr;
863
864 pps_get_ts(&now);
865 limit = now.ts_real;
866 timespec64_add_ns(&limit, SYNCHRONISE_PERIOD_NS);
867
868
869 while ((timespec64_compare(&now.ts_real, &limit) < 0) &&
870 READ_ONCE(*mc_running)) {
871 struct timespec64 update_time;
872 unsigned int host_time;
873
874
875 update_time = now.ts_real;
876 timespec64_add_ns(&update_time, SYNCHRONISATION_GRANULARITY_NS);
877 do {
878 pps_get_ts(&now);
879 } while ((timespec64_compare(&now.ts_real, &update_time) < 0) &&
880 READ_ONCE(*mc_running));
881
882
883 host_time = (now.ts_real.tv_sec << MC_NANOSECOND_BITS |
884 now.ts_real.tv_nsec);
885
886 efx->type->ptp_write_host_time(efx, host_time);
887 }
888 *last_time = now;
889 }
890
891
892 static void efx_ptp_read_timeset(MCDI_DECLARE_STRUCT_PTR(data),
893 struct efx_ptp_timeset *timeset)
894 {
895 unsigned start_ns, end_ns;
896
897 timeset->host_start = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_HOSTSTART);
898 timeset->major = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_MAJOR);
899 timeset->minor = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_MINOR);
900 timeset->host_end = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_HOSTEND),
901 timeset->wait = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_WAITNS);
902
903
904 start_ns = timeset->host_start & MC_NANOSECOND_MASK;
905 end_ns = timeset->host_end & MC_NANOSECOND_MASK;
906
907 if (end_ns < start_ns)
908 end_ns += NSEC_PER_SEC;
909
910 timeset->window = end_ns - start_ns;
911 }
912
913
914
915
916
917
918
919
920
921 static int
922 efx_ptp_process_times(struct efx_nic *efx, MCDI_DECLARE_STRUCT_PTR(synch_buf),
923 size_t response_length,
924 const struct pps_event_time *last_time)
925 {
926 unsigned number_readings =
927 MCDI_VAR_ARRAY_LEN(response_length,
928 PTP_OUT_SYNCHRONIZE_TIMESET);
929 unsigned i;
930 unsigned ngood = 0;
931 unsigned last_good = 0;
932 struct efx_ptp_data *ptp = efx->ptp_data;
933 u32 last_sec;
934 u32 start_sec;
935 struct timespec64 delta;
936 ktime_t mc_time;
937
938 if (number_readings == 0)
939 return -EAGAIN;
940
941
942
943
944
945
946
947 for (i = 0; i < number_readings; i++) {
948 s32 window, corrected;
949 struct timespec64 wait;
950
951 efx_ptp_read_timeset(
952 MCDI_ARRAY_STRUCT_PTR(synch_buf,
953 PTP_OUT_SYNCHRONIZE_TIMESET, i),
954 &ptp->timeset[i]);
955
956 wait = ktime_to_timespec64(
957 ptp->nic_to_kernel_time(0, ptp->timeset[i].wait, 0));
958 window = ptp->timeset[i].window;
959 corrected = window - wait.tv_nsec;
960
961
962
963
964
965
966
967
968
969
970 if (window < SYNCHRONISATION_GRANULARITY_NS) {
971 ++ptp->invalid_sync_windows;
972 } else if (corrected >= MAX_SYNCHRONISATION_NS) {
973 ++ptp->oversize_sync_windows;
974 } else if (corrected < ptp->min_synchronisation_ns) {
975 ++ptp->undersize_sync_windows;
976 } else {
977 ngood++;
978 last_good = i;
979 }
980 }
981
982 if (ngood == 0) {
983 netif_warn(efx, drv, efx->net_dev,
984 "PTP no suitable synchronisations\n");
985 return -EAGAIN;
986 }
987
988
989
990
991
992
993
994 start_sec = ptp->timeset[last_good].host_start >> MC_NANOSECOND_BITS;
995 last_sec = last_time->ts_real.tv_sec & MC_SECOND_MASK;
996 if (start_sec != last_sec &&
997 ((start_sec + 1) & MC_SECOND_MASK) != last_sec) {
998 netif_warn(efx, hw, efx->net_dev,
999 "PTP bad synchronisation seconds\n");
1000 return -EAGAIN;
1001 }
1002 delta.tv_sec = (last_sec - start_sec) & 1;
1003 delta.tv_nsec =
1004 last_time->ts_real.tv_nsec -
1005 (ptp->timeset[last_good].host_start & MC_NANOSECOND_MASK);
1006
1007
1008
1009
1010
1011 mc_time = ptp->nic_to_kernel_time(ptp->timeset[last_good].major,
1012 ptp->timeset[last_good].minor, 0);
1013
1014
1015 delta.tv_nsec += ktime_to_timespec64(mc_time).tv_nsec;
1016
1017
1018 ptp->host_time_pps = *last_time;
1019 pps_sub_ts(&ptp->host_time_pps, delta);
1020
1021 return 0;
1022 }
1023
1024
1025 static int efx_ptp_synchronize(struct efx_nic *efx, unsigned int num_readings)
1026 {
1027 struct efx_ptp_data *ptp = efx->ptp_data;
1028 MCDI_DECLARE_BUF(synch_buf, MC_CMD_PTP_OUT_SYNCHRONIZE_LENMAX);
1029 size_t response_length;
1030 int rc;
1031 unsigned long timeout;
1032 struct pps_event_time last_time = {};
1033 unsigned int loops = 0;
1034 int *start = ptp->start.addr;
1035
1036 MCDI_SET_DWORD(synch_buf, PTP_IN_OP, MC_CMD_PTP_OP_SYNCHRONIZE);
1037 MCDI_SET_DWORD(synch_buf, PTP_IN_PERIPH_ID, 0);
1038 MCDI_SET_DWORD(synch_buf, PTP_IN_SYNCHRONIZE_NUMTIMESETS,
1039 num_readings);
1040 MCDI_SET_QWORD(synch_buf, PTP_IN_SYNCHRONIZE_START_ADDR,
1041 ptp->start.dma_addr);
1042
1043
1044 WRITE_ONCE(*start, 0);
1045 rc = efx_mcdi_rpc_start(efx, MC_CMD_PTP, synch_buf,
1046 MC_CMD_PTP_IN_SYNCHRONIZE_LEN);
1047 EFX_WARN_ON_ONCE_PARANOID(rc);
1048
1049
1050 timeout = jiffies + msecs_to_jiffies(MAX_SYNCHRONISE_WAIT_MS);
1051 while (!READ_ONCE(*start) && (time_before(jiffies, timeout))) {
1052 udelay(20);
1053 loops++;
1054 }
1055
1056 if (loops <= 1)
1057 ++ptp->fast_syncs;
1058 if (!time_before(jiffies, timeout))
1059 ++ptp->sync_timeouts;
1060
1061 if (READ_ONCE(*start))
1062 efx_ptp_send_times(efx, &last_time);
1063
1064
1065 rc = efx_mcdi_rpc_finish(efx, MC_CMD_PTP,
1066 MC_CMD_PTP_IN_SYNCHRONIZE_LEN,
1067 synch_buf, sizeof(synch_buf),
1068 &response_length);
1069 if (rc == 0) {
1070 rc = efx_ptp_process_times(efx, synch_buf, response_length,
1071 &last_time);
1072 if (rc == 0)
1073 ++ptp->good_syncs;
1074 else
1075 ++ptp->no_time_syncs;
1076 }
1077
1078
1079
1080
1081 if (rc != 0)
1082 ++ptp->bad_syncs;
1083
1084 return rc;
1085 }
1086
1087
1088 static void efx_ptp_xmit_skb_queue(struct efx_nic *efx, struct sk_buff *skb)
1089 {
1090 struct efx_ptp_data *ptp_data = efx->ptp_data;
1091 struct efx_tx_queue *tx_queue;
1092 u8 type = skb->ip_summed == CHECKSUM_PARTIAL ? EFX_TXQ_TYPE_OFFLOAD : 0;
1093
1094 tx_queue = &ptp_data->channel->tx_queue[type];
1095 if (tx_queue && tx_queue->timestamping) {
1096 efx_enqueue_skb(tx_queue, skb);
1097 } else {
1098 WARN_ONCE(1, "PTP channel has no timestamped tx queue\n");
1099 dev_kfree_skb_any(skb);
1100 }
1101 }
1102
1103
1104 static void efx_ptp_xmit_skb_mc(struct efx_nic *efx, struct sk_buff *skb)
1105 {
1106 struct efx_ptp_data *ptp_data = efx->ptp_data;
1107 struct skb_shared_hwtstamps timestamps;
1108 int rc = -EIO;
1109 MCDI_DECLARE_BUF(txtime, MC_CMD_PTP_OUT_TRANSMIT_LEN);
1110 size_t len;
1111
1112 MCDI_SET_DWORD(ptp_data->txbuf, PTP_IN_OP, MC_CMD_PTP_OP_TRANSMIT);
1113 MCDI_SET_DWORD(ptp_data->txbuf, PTP_IN_PERIPH_ID, 0);
1114 MCDI_SET_DWORD(ptp_data->txbuf, PTP_IN_TRANSMIT_LENGTH, skb->len);
1115 if (skb_shinfo(skb)->nr_frags != 0) {
1116 rc = skb_linearize(skb);
1117 if (rc != 0)
1118 goto fail;
1119 }
1120
1121 if (skb->ip_summed == CHECKSUM_PARTIAL) {
1122 rc = skb_checksum_help(skb);
1123 if (rc != 0)
1124 goto fail;
1125 }
1126 skb_copy_from_linear_data(skb,
1127 MCDI_PTR(ptp_data->txbuf,
1128 PTP_IN_TRANSMIT_PACKET),
1129 skb->len);
1130 rc = efx_mcdi_rpc(efx, MC_CMD_PTP,
1131 ptp_data->txbuf, MC_CMD_PTP_IN_TRANSMIT_LEN(skb->len),
1132 txtime, sizeof(txtime), &len);
1133 if (rc != 0)
1134 goto fail;
1135
1136 memset(×tamps, 0, sizeof(timestamps));
1137 timestamps.hwtstamp = ptp_data->nic_to_kernel_time(
1138 MCDI_DWORD(txtime, PTP_OUT_TRANSMIT_MAJOR),
1139 MCDI_DWORD(txtime, PTP_OUT_TRANSMIT_MINOR),
1140 ptp_data->ts_corrections.ptp_tx);
1141
1142 skb_tstamp_tx(skb, ×tamps);
1143
1144 rc = 0;
1145
1146 fail:
1147 dev_kfree_skb_any(skb);
1148
1149 return;
1150 }
1151
1152 static void efx_ptp_drop_time_expired_events(struct efx_nic *efx)
1153 {
1154 struct efx_ptp_data *ptp = efx->ptp_data;
1155 struct list_head *cursor;
1156 struct list_head *next;
1157
1158 if (ptp->rx_ts_inline)
1159 return;
1160
1161
1162 spin_lock_bh(&ptp->evt_lock);
1163 if (!list_empty(&ptp->evt_list)) {
1164 list_for_each_safe(cursor, next, &ptp->evt_list) {
1165 struct efx_ptp_event_rx *evt;
1166
1167 evt = list_entry(cursor, struct efx_ptp_event_rx,
1168 link);
1169 if (time_after(jiffies, evt->expiry)) {
1170 list_move(&evt->link, &ptp->evt_free_list);
1171 netif_warn(efx, hw, efx->net_dev,
1172 "PTP rx event dropped\n");
1173 }
1174 }
1175 }
1176 spin_unlock_bh(&ptp->evt_lock);
1177 }
1178
1179 static enum ptp_packet_state efx_ptp_match_rx(struct efx_nic *efx,
1180 struct sk_buff *skb)
1181 {
1182 struct efx_ptp_data *ptp = efx->ptp_data;
1183 bool evts_waiting;
1184 struct list_head *cursor;
1185 struct list_head *next;
1186 struct efx_ptp_match *match;
1187 enum ptp_packet_state rc = PTP_PACKET_STATE_UNMATCHED;
1188
1189 WARN_ON_ONCE(ptp->rx_ts_inline);
1190
1191 spin_lock_bh(&ptp->evt_lock);
1192 evts_waiting = !list_empty(&ptp->evt_list);
1193 spin_unlock_bh(&ptp->evt_lock);
1194
1195 if (!evts_waiting)
1196 return PTP_PACKET_STATE_UNMATCHED;
1197
1198 match = (struct efx_ptp_match *)skb->cb;
1199
1200 spin_lock_bh(&ptp->evt_lock);
1201 list_for_each_safe(cursor, next, &ptp->evt_list) {
1202 struct efx_ptp_event_rx *evt;
1203
1204 evt = list_entry(cursor, struct efx_ptp_event_rx, link);
1205 if ((evt->seq0 == match->words[0]) &&
1206 (evt->seq1 == match->words[1])) {
1207 struct skb_shared_hwtstamps *timestamps;
1208
1209
1210 timestamps = skb_hwtstamps(skb);
1211 timestamps->hwtstamp = evt->hwtimestamp;
1212
1213 match->state = PTP_PACKET_STATE_MATCHED;
1214 rc = PTP_PACKET_STATE_MATCHED;
1215 list_move(&evt->link, &ptp->evt_free_list);
1216 break;
1217 }
1218 }
1219 spin_unlock_bh(&ptp->evt_lock);
1220
1221 return rc;
1222 }
1223
1224
1225
1226
1227
1228 static void efx_ptp_process_events(struct efx_nic *efx, struct sk_buff_head *q)
1229 {
1230 struct efx_ptp_data *ptp = efx->ptp_data;
1231 struct sk_buff *skb;
1232
1233 while ((skb = skb_dequeue(&ptp->rxq))) {
1234 struct efx_ptp_match *match;
1235
1236 match = (struct efx_ptp_match *)skb->cb;
1237 if (match->state == PTP_PACKET_STATE_MATCH_UNWANTED) {
1238 __skb_queue_tail(q, skb);
1239 } else if (efx_ptp_match_rx(efx, skb) ==
1240 PTP_PACKET_STATE_MATCHED) {
1241 __skb_queue_tail(q, skb);
1242 } else if (time_after(jiffies, match->expiry)) {
1243 match->state = PTP_PACKET_STATE_TIMED_OUT;
1244 ++ptp->rx_no_timestamp;
1245 __skb_queue_tail(q, skb);
1246 } else {
1247
1248 skb_queue_head(&ptp->rxq, skb);
1249 break;
1250 }
1251 }
1252 }
1253
1254
1255 static inline void efx_ptp_process_rx(struct efx_nic *efx, struct sk_buff *skb)
1256 {
1257 local_bh_disable();
1258 netif_receive_skb(skb);
1259 local_bh_enable();
1260 }
1261
1262 static void efx_ptp_remove_multicast_filters(struct efx_nic *efx)
1263 {
1264 struct efx_ptp_data *ptp = efx->ptp_data;
1265
1266 if (ptp->rxfilter_installed) {
1267 efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
1268 ptp->rxfilter_general);
1269 efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
1270 ptp->rxfilter_event);
1271 ptp->rxfilter_installed = false;
1272 }
1273 }
1274
1275 static int efx_ptp_insert_multicast_filters(struct efx_nic *efx)
1276 {
1277 struct efx_ptp_data *ptp = efx->ptp_data;
1278 struct efx_filter_spec rxfilter;
1279 int rc;
1280
1281 if (!ptp->channel || ptp->rxfilter_installed)
1282 return 0;
1283
1284
1285
1286
1287 efx_filter_init_rx(&rxfilter, EFX_FILTER_PRI_REQUIRED, 0,
1288 efx_rx_queue_index(
1289 efx_channel_get_rx_queue(ptp->channel)));
1290 rc = efx_filter_set_ipv4_local(&rxfilter, IPPROTO_UDP,
1291 htonl(PTP_ADDRESS),
1292 htons(PTP_EVENT_PORT));
1293 if (rc != 0)
1294 return rc;
1295
1296 rc = efx_filter_insert_filter(efx, &rxfilter, true);
1297 if (rc < 0)
1298 return rc;
1299 ptp->rxfilter_event = rc;
1300
1301 efx_filter_init_rx(&rxfilter, EFX_FILTER_PRI_REQUIRED, 0,
1302 efx_rx_queue_index(
1303 efx_channel_get_rx_queue(ptp->channel)));
1304 rc = efx_filter_set_ipv4_local(&rxfilter, IPPROTO_UDP,
1305 htonl(PTP_ADDRESS),
1306 htons(PTP_GENERAL_PORT));
1307 if (rc != 0)
1308 goto fail;
1309
1310 rc = efx_filter_insert_filter(efx, &rxfilter, true);
1311 if (rc < 0)
1312 goto fail;
1313 ptp->rxfilter_general = rc;
1314
1315 ptp->rxfilter_installed = true;
1316 return 0;
1317
1318 fail:
1319 efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
1320 ptp->rxfilter_event);
1321 return rc;
1322 }
1323
1324 static int efx_ptp_start(struct efx_nic *efx)
1325 {
1326 struct efx_ptp_data *ptp = efx->ptp_data;
1327 int rc;
1328
1329 ptp->reset_required = false;
1330
1331 rc = efx_ptp_insert_multicast_filters(efx);
1332 if (rc)
1333 return rc;
1334
1335 rc = efx_ptp_enable(efx);
1336 if (rc != 0)
1337 goto fail;
1338
1339 ptp->evt_frag_idx = 0;
1340 ptp->current_adjfreq = 0;
1341
1342 return 0;
1343
1344 fail:
1345 efx_ptp_remove_multicast_filters(efx);
1346 return rc;
1347 }
1348
1349 static int efx_ptp_stop(struct efx_nic *efx)
1350 {
1351 struct efx_ptp_data *ptp = efx->ptp_data;
1352 struct list_head *cursor;
1353 struct list_head *next;
1354 int rc;
1355
1356 if (ptp == NULL)
1357 return 0;
1358
1359 rc = efx_ptp_disable(efx);
1360
1361 efx_ptp_remove_multicast_filters(efx);
1362
1363
1364 efx_ptp_deliver_rx_queue(&efx->ptp_data->rxq);
1365 skb_queue_purge(&efx->ptp_data->txq);
1366
1367
1368 spin_lock_bh(&efx->ptp_data->evt_lock);
1369 list_for_each_safe(cursor, next, &efx->ptp_data->evt_list) {
1370 list_move(cursor, &efx->ptp_data->evt_free_list);
1371 }
1372 spin_unlock_bh(&efx->ptp_data->evt_lock);
1373
1374 return rc;
1375 }
1376
1377 static int efx_ptp_restart(struct efx_nic *efx)
1378 {
1379 if (efx->ptp_data && efx->ptp_data->enabled)
1380 return efx_ptp_start(efx);
1381 return 0;
1382 }
1383
1384 static void efx_ptp_pps_worker(struct work_struct *work)
1385 {
1386 struct efx_ptp_data *ptp =
1387 container_of(work, struct efx_ptp_data, pps_work);
1388 struct efx_nic *efx = ptp->efx;
1389 struct ptp_clock_event ptp_evt;
1390
1391 if (efx_ptp_synchronize(efx, PTP_SYNC_ATTEMPTS))
1392 return;
1393
1394 ptp_evt.type = PTP_CLOCK_PPSUSR;
1395 ptp_evt.pps_times = ptp->host_time_pps;
1396 ptp_clock_event(ptp->phc_clock, &ptp_evt);
1397 }
1398
1399 static void efx_ptp_worker(struct work_struct *work)
1400 {
1401 struct efx_ptp_data *ptp_data =
1402 container_of(work, struct efx_ptp_data, work);
1403 struct efx_nic *efx = ptp_data->efx;
1404 struct sk_buff *skb;
1405 struct sk_buff_head tempq;
1406
1407 if (ptp_data->reset_required) {
1408 efx_ptp_stop(efx);
1409 efx_ptp_start(efx);
1410 return;
1411 }
1412
1413 efx_ptp_drop_time_expired_events(efx);
1414
1415 __skb_queue_head_init(&tempq);
1416 efx_ptp_process_events(efx, &tempq);
1417
1418 while ((skb = skb_dequeue(&ptp_data->txq)))
1419 ptp_data->xmit_skb(efx, skb);
1420
1421 while ((skb = __skb_dequeue(&tempq)))
1422 efx_ptp_process_rx(efx, skb);
1423 }
1424
1425 static const struct ptp_clock_info efx_phc_clock_info = {
1426 .owner = THIS_MODULE,
1427 .name = "sfc",
1428 .max_adj = MAX_PPB,
1429 .n_alarm = 0,
1430 .n_ext_ts = 0,
1431 .n_per_out = 0,
1432 .n_pins = 0,
1433 .pps = 1,
1434 .adjfreq = efx_phc_adjfreq,
1435 .adjtime = efx_phc_adjtime,
1436 .gettime64 = efx_phc_gettime,
1437 .settime64 = efx_phc_settime,
1438 .enable = efx_phc_enable,
1439 };
1440
1441
1442 int efx_ptp_probe(struct efx_nic *efx, struct efx_channel *channel)
1443 {
1444 struct efx_ptp_data *ptp;
1445 int rc = 0;
1446 unsigned int pos;
1447
1448 ptp = kzalloc(sizeof(struct efx_ptp_data), GFP_KERNEL);
1449 efx->ptp_data = ptp;
1450 if (!efx->ptp_data)
1451 return -ENOMEM;
1452
1453 ptp->efx = efx;
1454 ptp->channel = channel;
1455 ptp->rx_ts_inline = efx_nic_rev(efx) >= EFX_REV_HUNT_A0;
1456
1457 rc = efx_nic_alloc_buffer(efx, &ptp->start, sizeof(int), GFP_KERNEL);
1458 if (rc != 0)
1459 goto fail1;
1460
1461 skb_queue_head_init(&ptp->rxq);
1462 skb_queue_head_init(&ptp->txq);
1463 ptp->workwq = create_singlethread_workqueue("sfc_ptp");
1464 if (!ptp->workwq) {
1465 rc = -ENOMEM;
1466 goto fail2;
1467 }
1468
1469 if (efx_ptp_use_mac_tx_timestamps(efx)) {
1470 ptp->xmit_skb = efx_ptp_xmit_skb_queue;
1471
1472 channel->sync_events_state = SYNC_EVENTS_QUIESCENT;
1473 } else {
1474 ptp->xmit_skb = efx_ptp_xmit_skb_mc;
1475 }
1476
1477 INIT_WORK(&ptp->work, efx_ptp_worker);
1478 ptp->config.flags = 0;
1479 ptp->config.tx_type = HWTSTAMP_TX_OFF;
1480 ptp->config.rx_filter = HWTSTAMP_FILTER_NONE;
1481 INIT_LIST_HEAD(&ptp->evt_list);
1482 INIT_LIST_HEAD(&ptp->evt_free_list);
1483 spin_lock_init(&ptp->evt_lock);
1484 for (pos = 0; pos < MAX_RECEIVE_EVENTS; pos++)
1485 list_add(&ptp->rx_evts[pos].link, &ptp->evt_free_list);
1486
1487
1488 rc = efx_ptp_get_attributes(efx);
1489 if (rc < 0)
1490 goto fail3;
1491
1492
1493 rc = efx_ptp_get_timestamp_corrections(efx);
1494 if (rc < 0)
1495 goto fail3;
1496
1497 if (efx->mcdi->fn_flags &
1498 (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_PRIMARY)) {
1499 ptp->phc_clock_info = efx_phc_clock_info;
1500 ptp->phc_clock = ptp_clock_register(&ptp->phc_clock_info,
1501 &efx->pci_dev->dev);
1502 if (IS_ERR(ptp->phc_clock)) {
1503 rc = PTR_ERR(ptp->phc_clock);
1504 goto fail3;
1505 } else if (ptp->phc_clock) {
1506 INIT_WORK(&ptp->pps_work, efx_ptp_pps_worker);
1507 ptp->pps_workwq = create_singlethread_workqueue("sfc_pps");
1508 if (!ptp->pps_workwq) {
1509 rc = -ENOMEM;
1510 goto fail4;
1511 }
1512 }
1513 }
1514 ptp->nic_ts_enabled = false;
1515
1516 return 0;
1517 fail4:
1518 ptp_clock_unregister(efx->ptp_data->phc_clock);
1519
1520 fail3:
1521 destroy_workqueue(efx->ptp_data->workwq);
1522
1523 fail2:
1524 efx_nic_free_buffer(efx, &ptp->start);
1525
1526 fail1:
1527 kfree(efx->ptp_data);
1528 efx->ptp_data = NULL;
1529
1530 return rc;
1531 }
1532
1533
1534
1535
1536
1537
1538 static int efx_ptp_probe_channel(struct efx_channel *channel)
1539 {
1540 struct efx_nic *efx = channel->efx;
1541 int rc;
1542
1543 channel->irq_moderation_us = 0;
1544 channel->rx_queue.core_index = 0;
1545
1546 rc = efx_ptp_probe(efx, channel);
1547
1548
1549
1550
1551
1552 if (rc && rc != -EPERM)
1553 netif_warn(efx, drv, efx->net_dev,
1554 "Failed to probe PTP, rc=%d\n", rc);
1555 return 0;
1556 }
1557
1558 void efx_ptp_remove(struct efx_nic *efx)
1559 {
1560 if (!efx->ptp_data)
1561 return;
1562
1563 (void)efx_ptp_disable(efx);
1564
1565 cancel_work_sync(&efx->ptp_data->work);
1566 if (efx->ptp_data->pps_workwq)
1567 cancel_work_sync(&efx->ptp_data->pps_work);
1568
1569 skb_queue_purge(&efx->ptp_data->rxq);
1570 skb_queue_purge(&efx->ptp_data->txq);
1571
1572 if (efx->ptp_data->phc_clock) {
1573 destroy_workqueue(efx->ptp_data->pps_workwq);
1574 ptp_clock_unregister(efx->ptp_data->phc_clock);
1575 }
1576
1577 destroy_workqueue(efx->ptp_data->workwq);
1578
1579 efx_nic_free_buffer(efx, &efx->ptp_data->start);
1580 kfree(efx->ptp_data);
1581 efx->ptp_data = NULL;
1582 }
1583
1584 static void efx_ptp_remove_channel(struct efx_channel *channel)
1585 {
1586 efx_ptp_remove(channel->efx);
1587 }
1588
1589 static void efx_ptp_get_channel_name(struct efx_channel *channel,
1590 char *buf, size_t len)
1591 {
1592 snprintf(buf, len, "%s-ptp", channel->efx->name);
1593 }
1594
1595
1596
1597
1598 bool efx_ptp_is_ptp_tx(struct efx_nic *efx, struct sk_buff *skb)
1599 {
1600 return efx->ptp_data &&
1601 efx->ptp_data->enabled &&
1602 skb->len >= PTP_MIN_LENGTH &&
1603 skb->len <= MC_CMD_PTP_IN_TRANSMIT_PACKET_MAXNUM &&
1604 likely(skb->protocol == htons(ETH_P_IP)) &&
1605 skb_transport_header_was_set(skb) &&
1606 skb_network_header_len(skb) >= sizeof(struct iphdr) &&
1607 ip_hdr(skb)->protocol == IPPROTO_UDP &&
1608 skb_headlen(skb) >=
1609 skb_transport_offset(skb) + sizeof(struct udphdr) &&
1610 udp_hdr(skb)->dest == htons(PTP_EVENT_PORT);
1611 }
1612
1613
1614
1615
1616
1617 static bool efx_ptp_rx(struct efx_channel *channel, struct sk_buff *skb)
1618 {
1619 struct efx_nic *efx = channel->efx;
1620 struct efx_ptp_data *ptp = efx->ptp_data;
1621 struct efx_ptp_match *match = (struct efx_ptp_match *)skb->cb;
1622 u8 *match_data_012, *match_data_345;
1623 unsigned int version;
1624 u8 *data;
1625
1626 match->expiry = jiffies + msecs_to_jiffies(PKT_EVENT_LIFETIME_MS);
1627
1628
1629 if (ptp->mode == MC_CMD_PTP_MODE_V1) {
1630 if (!pskb_may_pull(skb, PTP_V1_MIN_LENGTH)) {
1631 return false;
1632 }
1633 data = skb->data;
1634 version = ntohs(*(__be16 *)&data[PTP_V1_VERSION_OFFSET]);
1635 if (version != PTP_VERSION_V1) {
1636 return false;
1637 }
1638
1639
1640
1641
1642 match_data_012 = data + PTP_V1_UUID_OFFSET;
1643 match_data_345 = data + PTP_V1_UUID_OFFSET + 3;
1644 } else {
1645 if (!pskb_may_pull(skb, PTP_V2_MIN_LENGTH)) {
1646 return false;
1647 }
1648 data = skb->data;
1649 version = data[PTP_V2_VERSION_OFFSET];
1650 if ((version & PTP_VERSION_V2_MASK) != PTP_VERSION_V2) {
1651 return false;
1652 }
1653
1654
1655
1656
1657
1658
1659
1660
1661 match_data_345 = data + PTP_V2_UUID_OFFSET + 5;
1662 if (ptp->mode == MC_CMD_PTP_MODE_V2) {
1663 match_data_012 = data + PTP_V2_UUID_OFFSET + 2;
1664 } else {
1665 match_data_012 = data + PTP_V2_UUID_OFFSET + 0;
1666 BUG_ON(ptp->mode != MC_CMD_PTP_MODE_V2_ENHANCED);
1667 }
1668 }
1669
1670
1671 if (ntohs(*(__be16 *)&data[PTP_DPORT_OFFSET]) == PTP_EVENT_PORT) {
1672 match->state = PTP_PACKET_STATE_UNMATCHED;
1673
1674
1675
1676
1677 BUILD_BUG_ON(PTP_V1_SEQUENCE_OFFSET != PTP_V2_SEQUENCE_OFFSET);
1678 BUILD_BUG_ON(PTP_V1_SEQUENCE_LENGTH != PTP_V2_SEQUENCE_LENGTH);
1679
1680
1681 match->words[0] = (match_data_012[0] |
1682 (match_data_012[1] << 8) |
1683 (match_data_012[2] << 16) |
1684 (match_data_345[0] << 24));
1685 match->words[1] = (match_data_345[1] |
1686 (match_data_345[2] << 8) |
1687 (data[PTP_V1_SEQUENCE_OFFSET +
1688 PTP_V1_SEQUENCE_LENGTH - 1] <<
1689 16));
1690 } else {
1691 match->state = PTP_PACKET_STATE_MATCH_UNWANTED;
1692 }
1693
1694 skb_queue_tail(&ptp->rxq, skb);
1695 queue_work(ptp->workwq, &ptp->work);
1696
1697 return true;
1698 }
1699
1700
1701
1702
1703
1704 int efx_ptp_tx(struct efx_nic *efx, struct sk_buff *skb)
1705 {
1706 struct efx_ptp_data *ptp = efx->ptp_data;
1707
1708 skb_queue_tail(&ptp->txq, skb);
1709
1710 if ((udp_hdr(skb)->dest == htons(PTP_EVENT_PORT)) &&
1711 (skb->len <= MC_CMD_PTP_IN_TRANSMIT_PACKET_MAXNUM))
1712 efx_xmit_hwtstamp_pending(skb);
1713 queue_work(ptp->workwq, &ptp->work);
1714
1715 return NETDEV_TX_OK;
1716 }
1717
1718 int efx_ptp_get_mode(struct efx_nic *efx)
1719 {
1720 return efx->ptp_data->mode;
1721 }
1722
1723 int efx_ptp_change_mode(struct efx_nic *efx, bool enable_wanted,
1724 unsigned int new_mode)
1725 {
1726 if ((enable_wanted != efx->ptp_data->enabled) ||
1727 (enable_wanted && (efx->ptp_data->mode != new_mode))) {
1728 int rc = 0;
1729
1730 if (enable_wanted) {
1731
1732 if (efx->ptp_data->enabled &&
1733 (efx->ptp_data->mode != new_mode)) {
1734 efx->ptp_data->enabled = false;
1735 rc = efx_ptp_stop(efx);
1736 if (rc != 0)
1737 return rc;
1738 }
1739
1740
1741
1742
1743
1744 efx->ptp_data->mode = new_mode;
1745 if (netif_running(efx->net_dev))
1746 rc = efx_ptp_start(efx);
1747 if (rc == 0) {
1748 rc = efx_ptp_synchronize(efx,
1749 PTP_SYNC_ATTEMPTS * 2);
1750 if (rc != 0)
1751 efx_ptp_stop(efx);
1752 }
1753 } else {
1754 rc = efx_ptp_stop(efx);
1755 }
1756
1757 if (rc != 0)
1758 return rc;
1759
1760 efx->ptp_data->enabled = enable_wanted;
1761 }
1762
1763 return 0;
1764 }
1765
1766 static int efx_ptp_ts_init(struct efx_nic *efx, struct hwtstamp_config *init)
1767 {
1768 int rc;
1769
1770 if (init->flags)
1771 return -EINVAL;
1772
1773 if ((init->tx_type != HWTSTAMP_TX_OFF) &&
1774 (init->tx_type != HWTSTAMP_TX_ON))
1775 return -ERANGE;
1776
1777 rc = efx->type->ptp_set_ts_config(efx, init);
1778 if (rc)
1779 return rc;
1780
1781 efx->ptp_data->config = *init;
1782 return 0;
1783 }
1784
1785 void efx_ptp_get_ts_info(struct efx_nic *efx, struct ethtool_ts_info *ts_info)
1786 {
1787 struct efx_ptp_data *ptp = efx->ptp_data;
1788 struct efx_nic *primary = efx->primary;
1789
1790 ASSERT_RTNL();
1791
1792 if (!ptp)
1793 return;
1794
1795 ts_info->so_timestamping |= (SOF_TIMESTAMPING_TX_HARDWARE |
1796 SOF_TIMESTAMPING_RX_HARDWARE |
1797 SOF_TIMESTAMPING_RAW_HARDWARE);
1798
1799
1800
1801 if (efx_ptp_use_mac_tx_timestamps(efx)) {
1802 struct efx_ef10_nic_data *nic_data = efx->nic_data;
1803
1804 if (!(nic_data->licensed_features &
1805 (1 << LICENSED_V3_FEATURES_TX_TIMESTAMPS_LBN)))
1806 ts_info->so_timestamping &=
1807 ~SOF_TIMESTAMPING_TX_HARDWARE;
1808 }
1809 if (primary && primary->ptp_data && primary->ptp_data->phc_clock)
1810 ts_info->phc_index =
1811 ptp_clock_index(primary->ptp_data->phc_clock);
1812 ts_info->tx_types = 1 << HWTSTAMP_TX_OFF | 1 << HWTSTAMP_TX_ON;
1813 ts_info->rx_filters = ptp->efx->type->hwtstamp_filters;
1814 }
1815
1816 int efx_ptp_set_ts_config(struct efx_nic *efx, struct ifreq *ifr)
1817 {
1818 struct hwtstamp_config config;
1819 int rc;
1820
1821
1822 if (!efx->ptp_data)
1823 return -EOPNOTSUPP;
1824
1825 if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
1826 return -EFAULT;
1827
1828 rc = efx_ptp_ts_init(efx, &config);
1829 if (rc != 0)
1830 return rc;
1831
1832 return copy_to_user(ifr->ifr_data, &config, sizeof(config))
1833 ? -EFAULT : 0;
1834 }
1835
1836 int efx_ptp_get_ts_config(struct efx_nic *efx, struct ifreq *ifr)
1837 {
1838 if (!efx->ptp_data)
1839 return -EOPNOTSUPP;
1840
1841 return copy_to_user(ifr->ifr_data, &efx->ptp_data->config,
1842 sizeof(efx->ptp_data->config)) ? -EFAULT : 0;
1843 }
1844
1845 static void ptp_event_failure(struct efx_nic *efx, int expected_frag_len)
1846 {
1847 struct efx_ptp_data *ptp = efx->ptp_data;
1848
1849 netif_err(efx, hw, efx->net_dev,
1850 "PTP unexpected event length: got %d expected %d\n",
1851 ptp->evt_frag_idx, expected_frag_len);
1852 ptp->reset_required = true;
1853 queue_work(ptp->workwq, &ptp->work);
1854 }
1855
1856
1857
1858
1859
1860 static void ptp_event_rx(struct efx_nic *efx, struct efx_ptp_data *ptp)
1861 {
1862 struct efx_ptp_event_rx *evt = NULL;
1863
1864 if (WARN_ON_ONCE(ptp->rx_ts_inline))
1865 return;
1866
1867 if (ptp->evt_frag_idx != 3) {
1868 ptp_event_failure(efx, 3);
1869 return;
1870 }
1871
1872 spin_lock_bh(&ptp->evt_lock);
1873 if (!list_empty(&ptp->evt_free_list)) {
1874 evt = list_first_entry(&ptp->evt_free_list,
1875 struct efx_ptp_event_rx, link);
1876 list_del(&evt->link);
1877
1878 evt->seq0 = EFX_QWORD_FIELD(ptp->evt_frags[2], MCDI_EVENT_DATA);
1879 evt->seq1 = (EFX_QWORD_FIELD(ptp->evt_frags[2],
1880 MCDI_EVENT_SRC) |
1881 (EFX_QWORD_FIELD(ptp->evt_frags[1],
1882 MCDI_EVENT_SRC) << 8) |
1883 (EFX_QWORD_FIELD(ptp->evt_frags[0],
1884 MCDI_EVENT_SRC) << 16));
1885 evt->hwtimestamp = efx->ptp_data->nic_to_kernel_time(
1886 EFX_QWORD_FIELD(ptp->evt_frags[0], MCDI_EVENT_DATA),
1887 EFX_QWORD_FIELD(ptp->evt_frags[1], MCDI_EVENT_DATA),
1888 ptp->ts_corrections.ptp_rx);
1889 evt->expiry = jiffies + msecs_to_jiffies(PKT_EVENT_LIFETIME_MS);
1890 list_add_tail(&evt->link, &ptp->evt_list);
1891
1892 queue_work(ptp->workwq, &ptp->work);
1893 } else if (net_ratelimit()) {
1894
1895 netif_err(efx, rx_err, efx->net_dev, "PTP event queue overflow\n");
1896 }
1897 spin_unlock_bh(&ptp->evt_lock);
1898 }
1899
1900 static void ptp_event_fault(struct efx_nic *efx, struct efx_ptp_data *ptp)
1901 {
1902 int code = EFX_QWORD_FIELD(ptp->evt_frags[0], MCDI_EVENT_DATA);
1903 if (ptp->evt_frag_idx != 1) {
1904 ptp_event_failure(efx, 1);
1905 return;
1906 }
1907
1908 netif_err(efx, hw, efx->net_dev, "PTP error %d\n", code);
1909 }
1910
1911 static void ptp_event_pps(struct efx_nic *efx, struct efx_ptp_data *ptp)
1912 {
1913 if (ptp->nic_ts_enabled)
1914 queue_work(ptp->pps_workwq, &ptp->pps_work);
1915 }
1916
1917 void efx_ptp_event(struct efx_nic *efx, efx_qword_t *ev)
1918 {
1919 struct efx_ptp_data *ptp = efx->ptp_data;
1920 int code = EFX_QWORD_FIELD(*ev, MCDI_EVENT_CODE);
1921
1922 if (!ptp) {
1923 if (!efx->ptp_warned) {
1924 netif_warn(efx, drv, efx->net_dev,
1925 "Received PTP event but PTP not set up\n");
1926 efx->ptp_warned = true;
1927 }
1928 return;
1929 }
1930
1931 if (!ptp->enabled)
1932 return;
1933
1934 if (ptp->evt_frag_idx == 0) {
1935 ptp->evt_code = code;
1936 } else if (ptp->evt_code != code) {
1937 netif_err(efx, hw, efx->net_dev,
1938 "PTP out of sequence event %d\n", code);
1939 ptp->evt_frag_idx = 0;
1940 }
1941
1942 ptp->evt_frags[ptp->evt_frag_idx++] = *ev;
1943 if (!MCDI_EVENT_FIELD(*ev, CONT)) {
1944
1945 switch (code) {
1946 case MCDI_EVENT_CODE_PTP_RX:
1947 ptp_event_rx(efx, ptp);
1948 break;
1949 case MCDI_EVENT_CODE_PTP_FAULT:
1950 ptp_event_fault(efx, ptp);
1951 break;
1952 case MCDI_EVENT_CODE_PTP_PPS:
1953 ptp_event_pps(efx, ptp);
1954 break;
1955 default:
1956 netif_err(efx, hw, efx->net_dev,
1957 "PTP unknown event %d\n", code);
1958 break;
1959 }
1960 ptp->evt_frag_idx = 0;
1961 } else if (MAX_EVENT_FRAGS == ptp->evt_frag_idx) {
1962 netif_err(efx, hw, efx->net_dev,
1963 "PTP too many event fragments\n");
1964 ptp->evt_frag_idx = 0;
1965 }
1966 }
1967
1968 void efx_time_sync_event(struct efx_channel *channel, efx_qword_t *ev)
1969 {
1970 struct efx_nic *efx = channel->efx;
1971 struct efx_ptp_data *ptp = efx->ptp_data;
1972
1973
1974
1975
1976
1977
1978
1979 channel->sync_timestamp_major = MCDI_EVENT_FIELD(*ev, PTP_TIME_MAJOR);
1980 channel->sync_timestamp_minor =
1981 (MCDI_EVENT_FIELD(*ev, PTP_TIME_MINOR_MS_8BITS) & 0xFC)
1982 << ptp->nic_time.sync_event_minor_shift;
1983
1984
1985
1986
1987 (void) cmpxchg(&channel->sync_events_state, SYNC_EVENTS_REQUESTED,
1988 SYNC_EVENTS_VALID);
1989 }
1990
1991 static inline u32 efx_rx_buf_timestamp_minor(struct efx_nic *efx, const u8 *eh)
1992 {
1993 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
1994 return __le32_to_cpup((const __le32 *)(eh + efx->rx_packet_ts_offset));
1995 #else
1996 const u8 *data = eh + efx->rx_packet_ts_offset;
1997 return (u32)data[0] |
1998 (u32)data[1] << 8 |
1999 (u32)data[2] << 16 |
2000 (u32)data[3] << 24;
2001 #endif
2002 }
2003
2004 void __efx_rx_skb_attach_timestamp(struct efx_channel *channel,
2005 struct sk_buff *skb)
2006 {
2007 struct efx_nic *efx = channel->efx;
2008 struct efx_ptp_data *ptp = efx->ptp_data;
2009 u32 pkt_timestamp_major, pkt_timestamp_minor;
2010 u32 diff, carry;
2011 struct skb_shared_hwtstamps *timestamps;
2012
2013 if (channel->sync_events_state != SYNC_EVENTS_VALID)
2014 return;
2015
2016 pkt_timestamp_minor = efx_rx_buf_timestamp_minor(efx, skb_mac_header(skb));
2017
2018
2019
2020
2021 diff = pkt_timestamp_minor - channel->sync_timestamp_minor;
2022 if (pkt_timestamp_minor < channel->sync_timestamp_minor)
2023 diff += ptp->nic_time.minor_max;
2024
2025
2026 carry = (channel->sync_timestamp_minor >= ptp->nic_time.minor_max - diff) ?
2027 1 : 0;
2028
2029 if (diff <= ptp->nic_time.sync_event_diff_max) {
2030
2031
2032
2033 pkt_timestamp_major = channel->sync_timestamp_major + carry;
2034 } else if (diff >= ptp->nic_time.sync_event_diff_min) {
2035
2036
2037
2038
2039 pkt_timestamp_major = channel->sync_timestamp_major - 1 + carry;
2040 } else {
2041
2042
2043
2044
2045
2046 netif_vdbg(efx, drv, efx->net_dev,
2047 "packet timestamp %x too far from sync event %x:%x\n",
2048 pkt_timestamp_minor, channel->sync_timestamp_major,
2049 channel->sync_timestamp_minor);
2050 return;
2051 }
2052
2053
2054 timestamps = skb_hwtstamps(skb);
2055 timestamps->hwtstamp =
2056 ptp->nic_to_kernel_time(pkt_timestamp_major,
2057 pkt_timestamp_minor,
2058 ptp->ts_corrections.general_rx);
2059 }
2060
2061 static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)
2062 {
2063 struct efx_ptp_data *ptp_data = container_of(ptp,
2064 struct efx_ptp_data,
2065 phc_clock_info);
2066 struct efx_nic *efx = ptp_data->efx;
2067 MCDI_DECLARE_BUF(inadj, MC_CMD_PTP_IN_ADJUST_LEN);
2068 s64 adjustment_ns;
2069 int rc;
2070
2071 if (delta > MAX_PPB)
2072 delta = MAX_PPB;
2073 else if (delta < -MAX_PPB)
2074 delta = -MAX_PPB;
2075
2076
2077 adjustment_ns = ((s64)delta * PPB_SCALE_WORD +
2078 (1 << (ptp_data->adjfreq_ppb_shift - 1))) >>
2079 ptp_data->adjfreq_ppb_shift;
2080
2081 MCDI_SET_DWORD(inadj, PTP_IN_OP, MC_CMD_PTP_OP_ADJUST);
2082 MCDI_SET_DWORD(inadj, PTP_IN_PERIPH_ID, 0);
2083 MCDI_SET_QWORD(inadj, PTP_IN_ADJUST_FREQ, adjustment_ns);
2084 MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_SECONDS, 0);
2085 MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_NANOSECONDS, 0);
2086 rc = efx_mcdi_rpc(efx, MC_CMD_PTP, inadj, sizeof(inadj),
2087 NULL, 0, NULL);
2088 if (rc != 0)
2089 return rc;
2090
2091 ptp_data->current_adjfreq = adjustment_ns;
2092 return 0;
2093 }
2094
2095 static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta)
2096 {
2097 u32 nic_major, nic_minor;
2098 struct efx_ptp_data *ptp_data = container_of(ptp,
2099 struct efx_ptp_data,
2100 phc_clock_info);
2101 struct efx_nic *efx = ptp_data->efx;
2102 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_ADJUST_LEN);
2103
2104 efx->ptp_data->ns_to_nic_time(delta, &nic_major, &nic_minor);
2105
2106 MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_ADJUST);
2107 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);
2108 MCDI_SET_QWORD(inbuf, PTP_IN_ADJUST_FREQ, ptp_data->current_adjfreq);
2109 MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_MAJOR, nic_major);
2110 MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_MINOR, nic_minor);
2111 return efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf),
2112 NULL, 0, NULL);
2113 }
2114
2115 static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
2116 {
2117 struct efx_ptp_data *ptp_data = container_of(ptp,
2118 struct efx_ptp_data,
2119 phc_clock_info);
2120 struct efx_nic *efx = ptp_data->efx;
2121 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_READ_NIC_TIME_LEN);
2122 MCDI_DECLARE_BUF(outbuf, MC_CMD_PTP_OUT_READ_NIC_TIME_LEN);
2123 int rc;
2124 ktime_t kt;
2125
2126 MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_READ_NIC_TIME);
2127 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);
2128
2129 rc = efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf),
2130 outbuf, sizeof(outbuf), NULL);
2131 if (rc != 0)
2132 return rc;
2133
2134 kt = ptp_data->nic_to_kernel_time(
2135 MCDI_DWORD(outbuf, PTP_OUT_READ_NIC_TIME_MAJOR),
2136 MCDI_DWORD(outbuf, PTP_OUT_READ_NIC_TIME_MINOR), 0);
2137 *ts = ktime_to_timespec64(kt);
2138 return 0;
2139 }
2140
2141 static int efx_phc_settime(struct ptp_clock_info *ptp,
2142 const struct timespec64 *e_ts)
2143 {
2144
2145
2146
2147
2148 int rc;
2149 struct timespec64 time_now;
2150 struct timespec64 delta;
2151
2152 rc = efx_phc_gettime(ptp, &time_now);
2153 if (rc != 0)
2154 return rc;
2155
2156 delta = timespec64_sub(*e_ts, time_now);
2157
2158 rc = efx_phc_adjtime(ptp, timespec64_to_ns(&delta));
2159 if (rc != 0)
2160 return rc;
2161
2162 return 0;
2163 }
2164
2165 static int efx_phc_enable(struct ptp_clock_info *ptp,
2166 struct ptp_clock_request *request,
2167 int enable)
2168 {
2169 struct efx_ptp_data *ptp_data = container_of(ptp,
2170 struct efx_ptp_data,
2171 phc_clock_info);
2172 if (request->type != PTP_CLK_REQ_PPS)
2173 return -EOPNOTSUPP;
2174
2175 ptp_data->nic_ts_enabled = !!enable;
2176 return 0;
2177 }
2178
2179 static const struct efx_channel_type efx_ptp_channel_type = {
2180 .handle_no_channel = efx_ptp_handle_no_channel,
2181 .pre_probe = efx_ptp_probe_channel,
2182 .post_remove = efx_ptp_remove_channel,
2183 .get_name = efx_ptp_get_channel_name,
2184
2185 .receive_skb = efx_ptp_rx,
2186 .want_txqs = efx_ptp_want_txqs,
2187 .keep_eventq = false,
2188 };
2189
2190 void efx_ptp_defer_probe_with_channel(struct efx_nic *efx)
2191 {
2192
2193
2194
2195 if (efx_ptp_disable(efx) == 0)
2196 efx->extra_channel_type[EFX_EXTRA_CHANNEL_PTP] =
2197 &efx_ptp_channel_type;
2198 }
2199
2200 void efx_ptp_start_datapath(struct efx_nic *efx)
2201 {
2202 if (efx_ptp_restart(efx))
2203 netif_err(efx, drv, efx->net_dev, "Failed to restart PTP.\n");
2204
2205 if (efx->type->ptp_set_ts_sync_events)
2206 efx->type->ptp_set_ts_sync_events(efx, true, true);
2207 }
2208
2209 void efx_ptp_stop_datapath(struct efx_nic *efx)
2210 {
2211
2212 if (efx->type->ptp_set_ts_sync_events)
2213 efx->type->ptp_set_ts_sync_events(efx, false, true);
2214 efx_ptp_stop(efx);
2215 }