Commit dfd8d581 authored by Laurence Evans's avatar Laurence Evans Committed by Ben Hutchings

sfc: Tidy up PTP synchronization code

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent 94cd60d0
...@@ -435,7 +435,6 @@ efx_ptp_process_times(struct efx_nic *efx, MCDI_DECLARE_STRUCT_PTR(synch_buf), ...@@ -435,7 +435,6 @@ efx_ptp_process_times(struct efx_nic *efx, MCDI_DECLARE_STRUCT_PTR(synch_buf),
MCDI_VAR_ARRAY_LEN(response_length, MCDI_VAR_ARRAY_LEN(response_length,
PTP_OUT_SYNCHRONIZE_TIMESET); PTP_OUT_SYNCHRONIZE_TIMESET);
unsigned i; unsigned i;
unsigned total;
unsigned ngood = 0; unsigned ngood = 0;
unsigned last_good = 0; unsigned last_good = 0;
struct efx_ptp_data *ptp = efx->ptp_data; struct efx_ptp_data *ptp = efx->ptp_data;
...@@ -446,33 +445,38 @@ efx_ptp_process_times(struct efx_nic *efx, MCDI_DECLARE_STRUCT_PTR(synch_buf), ...@@ -446,33 +445,38 @@ efx_ptp_process_times(struct efx_nic *efx, MCDI_DECLARE_STRUCT_PTR(synch_buf),
if (number_readings == 0) if (number_readings == 0)
return -EAGAIN; return -EAGAIN;
/* Read the set of results and increment stats for any results that /* Read the set of results and find the last good host-MC
* appera to be erroneous. * 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++) { for (i = 0; i < number_readings; i++) {
s32 window, corrected;
efx_ptp_read_timeset( efx_ptp_read_timeset(
MCDI_ARRAY_STRUCT_PTR(synch_buf, MCDI_ARRAY_STRUCT_PTR(synch_buf,
PTP_OUT_SYNCHRONIZE_TIMESET, i), PTP_OUT_SYNCHRONIZE_TIMESET, i),
&ptp->timeset[i]); &ptp->timeset[i]);
}
/* Find the last good host-MC synchronization result. The MC times window = ptp->timeset[i].window;
* when it finishes reading the host time so the corrected window time corrected = window - ptp->timeset[i].waitns;
* should be fairly constant for a given platform.
*/ /* We expect the uncorrected synchronization window to be at
total = 0; * least as large as the interval between host start and end
for (i = 0; i < number_readings; i++) * times. If it is smaller than this then this is mostly likely
if (ptp->timeset[i].window > ptp->timeset[i].waitns) { * to be a consequence of the host's time being adjusted.
unsigned win; * Check that the corrected sync window is in a reasonable
* range. If it is out of range it is likely to be because an
win = ptp->timeset[i].window - ptp->timeset[i].waitns; * interrupt or other delay occurred between reading the system
if (win >= MIN_SYNCHRONISATION_NS && * time and writing it to MC memory.
win < MAX_SYNCHRONISATION_NS) { */
total += ptp->timeset[i].window; if (window >= SYNCHRONISATION_GRANULARITY_NS &&
ngood++; corrected < MAX_SYNCHRONISATION_NS &&
last_good = i; corrected >= MIN_SYNCHRONISATION_NS) {
} ngood++;
last_good = i;
} }
}
if (ngood == 0) { if (ngood == 0) {
netif_warn(efx, drv, efx->net_dev, netif_warn(efx, drv, efx->net_dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment