@@ -405,7 +405,7 @@ static void igb_pin_extts(struct igb_adapter *igb, int chan, int pin)
405
405
wr32 (E1000_CTRL_EXT , ctrl_ext );
406
406
}
407
407
408
- static void igb_pin_perout (struct igb_adapter * igb , int chan , int pin )
408
+ static void igb_pin_perout (struct igb_adapter * igb , int chan , int pin , int freq )
409
409
{
410
410
static const u32 aux0_sel_sdp [IGB_N_SDP ] = {
411
411
AUX0_SEL_SDP0 , AUX0_SEL_SDP1 , AUX0_SEL_SDP2 , AUX0_SEL_SDP3 ,
@@ -424,6 +424,14 @@ static void igb_pin_perout(struct igb_adapter *igb, int chan, int pin)
424
424
TS_SDP0_SEL_TT1 , TS_SDP1_SEL_TT1 ,
425
425
TS_SDP2_SEL_TT1 , TS_SDP3_SEL_TT1 ,
426
426
};
427
+ static const u32 ts_sdp_sel_fc0 [IGB_N_SDP ] = {
428
+ TS_SDP0_SEL_FC0 , TS_SDP1_SEL_FC0 ,
429
+ TS_SDP2_SEL_FC0 , TS_SDP3_SEL_FC0 ,
430
+ };
431
+ static const u32 ts_sdp_sel_fc1 [IGB_N_SDP ] = {
432
+ TS_SDP0_SEL_FC1 , TS_SDP1_SEL_FC1 ,
433
+ TS_SDP2_SEL_FC1 , TS_SDP3_SEL_FC1 ,
434
+ };
427
435
static const u32 ts_sdp_sel_clr [IGB_N_SDP ] = {
428
436
TS_SDP0_SEL_FC1 , TS_SDP1_SEL_FC1 ,
429
437
TS_SDP2_SEL_FC1 , TS_SDP3_SEL_FC1 ,
@@ -445,11 +453,17 @@ static void igb_pin_perout(struct igb_adapter *igb, int chan, int pin)
445
453
tssdp &= ~AUX1_TS_SDP_EN ;
446
454
447
455
tssdp &= ~ts_sdp_sel_clr [pin ];
448
- if (chan == 1 )
449
- tssdp |= ts_sdp_sel_tt1 [pin ];
450
- else
451
- tssdp |= ts_sdp_sel_tt0 [pin ];
452
-
456
+ if (freq ) {
457
+ if (chan == 1 )
458
+ tssdp |= ts_sdp_sel_fc1 [pin ];
459
+ else
460
+ tssdp |= ts_sdp_sel_fc0 [pin ];
461
+ } else {
462
+ if (chan == 1 )
463
+ tssdp |= ts_sdp_sel_tt1 [pin ];
464
+ else
465
+ tssdp |= ts_sdp_sel_tt0 [pin ];
466
+ }
453
467
tssdp |= ts_sdp_en [pin ];
454
468
455
469
wr32 (E1000_TSSDP , tssdp );
@@ -463,10 +477,10 @@ static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp,
463
477
struct igb_adapter * igb =
464
478
container_of (ptp , struct igb_adapter , ptp_caps );
465
479
struct e1000_hw * hw = & igb -> hw ;
466
- u32 tsauxc , tsim , tsauxc_mask , tsim_mask , trgttiml , trgttimh ;
480
+ u32 tsauxc , tsim , tsauxc_mask , tsim_mask , trgttiml , trgttimh , freqout ;
467
481
unsigned long flags ;
468
482
struct timespec ts ;
469
- int pin = -1 ;
483
+ int use_freq = 0 , pin = -1 ;
470
484
s64 ns ;
471
485
472
486
switch (rq -> type ) {
@@ -511,40 +525,58 @@ static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp,
511
525
ts .tv_nsec = rq -> perout .period .nsec ;
512
526
ns = timespec_to_ns (& ts );
513
527
ns = ns >> 1 ;
514
- if (on && ns < 500000LL ) {
515
- /* 2k interrupts per second is an awful lot. */
516
- return - EINVAL ;
528
+ if (on && ns <= 70000000LL ) {
529
+ if (ns < 8LL )
530
+ return - EINVAL ;
531
+ use_freq = 1 ;
517
532
}
518
533
ts = ns_to_timespec (ns );
519
534
if (rq -> perout .index == 1 ) {
520
- tsauxc_mask = TSAUXC_EN_TT1 ;
521
- tsim_mask = TSINTR_TT1 ;
535
+ if (use_freq ) {
536
+ tsauxc_mask = TSAUXC_EN_CLK1 | TSAUXC_ST1 ;
537
+ tsim_mask = 0 ;
538
+ } else {
539
+ tsauxc_mask = TSAUXC_EN_TT1 ;
540
+ tsim_mask = TSINTR_TT1 ;
541
+ }
522
542
trgttiml = E1000_TRGTTIML1 ;
523
543
trgttimh = E1000_TRGTTIMH1 ;
544
+ freqout = E1000_FREQOUT1 ;
524
545
} else {
525
- tsauxc_mask = TSAUXC_EN_TT0 ;
526
- tsim_mask = TSINTR_TT0 ;
546
+ if (use_freq ) {
547
+ tsauxc_mask = TSAUXC_EN_CLK0 | TSAUXC_ST0 ;
548
+ tsim_mask = 0 ;
549
+ } else {
550
+ tsauxc_mask = TSAUXC_EN_TT0 ;
551
+ tsim_mask = TSINTR_TT0 ;
552
+ }
527
553
trgttiml = E1000_TRGTTIML0 ;
528
554
trgttimh = E1000_TRGTTIMH0 ;
555
+ freqout = E1000_FREQOUT0 ;
529
556
}
530
557
spin_lock_irqsave (& igb -> tmreg_lock , flags );
531
558
tsauxc = rd32 (E1000_TSAUXC );
532
559
tsim = rd32 (E1000_TSIM );
560
+ if (rq -> perout .index == 1 ) {
561
+ tsauxc &= ~(TSAUXC_EN_TT1 | TSAUXC_EN_CLK1 | TSAUXC_ST1 );
562
+ tsim &= ~TSINTR_TT1 ;
563
+ } else {
564
+ tsauxc &= ~(TSAUXC_EN_TT0 | TSAUXC_EN_CLK0 | TSAUXC_ST0 );
565
+ tsim &= ~TSINTR_TT0 ;
566
+ }
533
567
if (on ) {
534
568
int i = rq -> perout .index ;
535
-
536
- igb_pin_perout (igb , i , pin );
569
+ igb_pin_perout (igb , i , pin , use_freq );
537
570
igb -> perout [i ].start .tv_sec = rq -> perout .start .sec ;
538
571
igb -> perout [i ].start .tv_nsec = rq -> perout .start .nsec ;
539
572
igb -> perout [i ].period .tv_sec = ts .tv_sec ;
540
573
igb -> perout [i ].period .tv_nsec = ts .tv_nsec ;
541
574
wr32 (trgttimh , rq -> perout .start .sec );
542
575
wr32 (trgttiml , rq -> perout .start .nsec );
576
+ if (use_freq )
577
+ wr32 (freqout , ns );
543
578
tsauxc |= tsauxc_mask ;
544
579
tsim |= tsim_mask ;
545
- } else {
546
- tsauxc &= ~tsauxc_mask ;
547
- tsim &= ~tsim_mask ;
548
580
}
549
581
wr32 (E1000_TSAUXC , tsauxc );
550
582
wr32 (E1000_TSIM , tsim );
0 commit comments