sfc: Tidy up PTP synchronization code
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
parent
94cd60d09e
commit
dfd8d581fb
1 changed files with 23 additions and 19 deletions
|
@ -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),
|
||||||
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.
|
|
||||||
*/
|
|
||||||
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;
|
/* We expect the uncorrected synchronization window to be at
|
||||||
if (win >= MIN_SYNCHRONISATION_NS &&
|
* least as large as the interval between host start and end
|
||||||
win < MAX_SYNCHRONISATION_NS) {
|
* times. If it is smaller than this then this is mostly likely
|
||||||
total += ptp->timeset[i].window;
|
* to be a consequence of the host's time being adjusted.
|
||||||
ngood++;
|
* Check that the corrected sync window is in a reasonable
|
||||||
last_good = i;
|
* 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) {
|
if (ngood == 0) {
|
||||||
netif_warn(efx, drv, efx->net_dev,
|
netif_warn(efx, drv, efx->net_dev,
|
||||||
|
|
Loading…
Add table
Reference in a new issue