Skip to content

Commit

Permalink
sfc: Tidy up PTP synchronization code
Browse files Browse the repository at this point in the history
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
  • Loading branch information
Laurence Evans authored and Ben Hutchings committed Dec 12, 2013
1 parent 94cd60d commit dfd8d58
Showing 1 changed file with 24 additions and 20 deletions.
44 changes: 24 additions & 20 deletions drivers/net/ethernet/sfc/ptp.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,6 @@ efx_ptp_process_times(struct efx_nic *efx, MCDI_DECLARE_STRUCT_PTR(synch_buf),
MCDI_VAR_ARRAY_LEN(response_length,
PTP_OUT_SYNCHRONIZE_TIMESET);
unsigned i;
unsigned total;
unsigned ngood = 0;
unsigned last_good = 0;
struct efx_ptp_data *ptp = efx->ptp_data;
Expand All @@ -446,33 +445,38 @@ efx_ptp_process_times(struct efx_nic *efx, MCDI_DECLARE_STRUCT_PTR(synch_buf),
if (number_readings == 0)
return -EAGAIN;

/* Read the set of results and increment stats for any results that
* appera to be erroneous.
/* Read the set of results and find the last good host-MC
* synchronization result. The MC times when it finishes reading the
* host time so the corrected window time should be fairly constant
* for a given platform.
*/
for (i = 0; i < number_readings; i++) {
s32 window, corrected;

efx_ptp_read_timeset(
MCDI_ARRAY_STRUCT_PTR(synch_buf,
PTP_OUT_SYNCHRONIZE_TIMESET, i),
&ptp->timeset[i]);
}

/* Find the last good host-MC synchronization result. The MC times
* when it finishes reading the host time so the corrected window time
* should be fairly constant for a given platform.
*/
total = 0;
for (i = 0; i < number_readings; i++)
if (ptp->timeset[i].window > ptp->timeset[i].waitns) {
unsigned win;

win = ptp->timeset[i].window - ptp->timeset[i].waitns;
if (win >= MIN_SYNCHRONISATION_NS &&
win < MAX_SYNCHRONISATION_NS) {
total += ptp->timeset[i].window;
ngood++;
last_good = i;
}
window = ptp->timeset[i].window;
corrected = window - ptp->timeset[i].waitns;

/* We expect the uncorrected synchronization window to be at
* least as large as the interval between host start and end
* times. If it is smaller than this then this is mostly likely
* to be a consequence of the host's time being adjusted.
* Check that the corrected sync window is in a reasonable
* range. If it is out of range it is likely to be because an
* interrupt or other delay occurred between reading the system
* time and writing it to MC memory.
*/
if (window >= SYNCHRONISATION_GRANULARITY_NS &&
corrected < MAX_SYNCHRONISATION_NS &&
corrected >= MIN_SYNCHRONISATION_NS) {
ngood++;
last_good = i;
}
}

if (ngood == 0) {
netif_warn(efx, drv, efx->net_dev,
Expand Down

0 comments on commit dfd8d58

Please sign in to comment.