Skip to content

Commit 84a192e

Browse files
agunasekanguy11
authored andcommitted
igc: Handle PPS start time programming for past time values
I225/6 hardware can be programmed to start PPS output once the time in Target Time registers is reached. The time programmed in these registers should always be into future. Only then PPS output is triggered when SYSTIM register reaches the programmed value. There are two modes in i225/6 hardware to program PPS, pulse and clock mode. There were issues reported where PPS is not generated when start time is in past. Example 1, "echo 0 0 0 2 0 > /sys/class/ptp/ptp0/period" In the current implementation, a value of '0' is programmed into Target time registers and PPS output is in pulse mode. Eventually an interrupt which is triggered upon SYSTIM register reaching Target time is not fired. Thus no PPS output is generated. Example 2, "echo 0 0 0 1 0 > /sys/class/ptp/ptp0/period" Above case, a value of '0' is programmed into Target time registers and PPS output is in clock mode. Here, HW tries to catch-up the current time by incrementing Target Time register. This catch-up time seem to vary according to programmed PPS period time as per the HW design. In my experiments, the delay ranged between few tens of seconds to few minutes. The PPS output is only generated after the Target time register reaches current time. In my experiments, I also observed PPS stopped working with below test and could not recover until module is removed and loaded again. 1) echo 0 <future time> 0 1 0 > /sys/class/ptp/ptp1/period 2) echo 0 0 0 1 0 > /sys/class/ptp/ptp1/period 3) echo 0 0 0 1 0 > /sys/class/ptp/ptp1/period After this PPS did not work even if i re-program with proper values. I could only get this back working by reloading the driver. This patch takes care of calculating and programming appropriate future time value into Target Time registers. Fixes: 5e91c72 ("igc: Fix PPS delta between two synchronized end-points") Signed-off-by: Aravindhan Gunasekaran <aravindhan.gunasekaran@intel.com> Reviewed-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Tested-by: Naama Meir <naamax.meir@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
1 parent 2510289 commit 84a192e

1 file changed

Lines changed: 22 additions & 3 deletions

File tree

drivers/net/ethernet/intel/igc/igc_ptp.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,16 +356,35 @@ static int igc_ptp_feature_enable_i225(struct ptp_clock_info *ptp,
356356
tsim &= ~IGC_TSICR_TT0;
357357
}
358358
if (on) {
359+
struct timespec64 safe_start;
359360
int i = rq->perout.index;
360361

361362
igc_pin_perout(igc, i, pin, use_freq);
362-
igc->perout[i].start.tv_sec = rq->perout.start.sec;
363+
igc_ptp_read(igc, &safe_start);
364+
365+
/* PPS output start time is triggered by Target time(TT)
366+
* register. Programming any past time value into TT
367+
* register will cause PPS to never start. Need to make
368+
* sure we program the TT register a time ahead in
369+
* future. There isn't a stringent need to fire PPS out
370+
* right away. Adding +2 seconds should take care of
371+
* corner cases. Let's say if the SYSTIML is close to
372+
* wrap up and the timer keeps ticking as we program the
373+
* register, adding +2seconds is safe bet.
374+
*/
375+
safe_start.tv_sec += 2;
376+
377+
if (rq->perout.start.sec < safe_start.tv_sec)
378+
igc->perout[i].start.tv_sec = safe_start.tv_sec;
379+
else
380+
igc->perout[i].start.tv_sec = rq->perout.start.sec;
363381
igc->perout[i].start.tv_nsec = rq->perout.start.nsec;
364382
igc->perout[i].period.tv_sec = ts.tv_sec;
365383
igc->perout[i].period.tv_nsec = ts.tv_nsec;
366-
wr32(trgttimh, rq->perout.start.sec);
384+
wr32(trgttimh, (u32)igc->perout[i].start.tv_sec);
367385
/* For now, always select timer 0 as source. */
368-
wr32(trgttiml, rq->perout.start.nsec | IGC_TT_IO_TIMER_SEL_SYSTIM0);
386+
wr32(trgttiml, (u32)(igc->perout[i].start.tv_nsec |
387+
IGC_TT_IO_TIMER_SEL_SYSTIM0));
369388
if (use_freq)
370389
wr32(freqout, ns);
371390
tsauxc |= tsauxc_mask;

0 commit comments

Comments
 (0)