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