Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

sfc: Tidy up PTP synchronization code

parent 94cd60d0
Loading
Loading
Loading
Loading
+24 −20
Original line number Diff line number Diff line
@@ -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;
@@ -446,29 +445,34 @@ 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.
		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.
		 */
	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;
		if (window >= SYNCHRONISATION_GRANULARITY_NS &&
		    corrected < MAX_SYNCHRONISATION_NS &&
		    corrected >= MIN_SYNCHRONISATION_NS) {
			ngood++;
			last_good = i;
		}