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

Commit 62a1c703 authored by Ben Hutchings's avatar Ben Hutchings
Browse files

sfc: Split PTP multicast filter insertion/removal out of efx_ptp_{start,stop}()

parent 065e64c4
Loading
Loading
Loading
Loading
+39 −17
Original line number Original line Diff line number Diff line
@@ -755,13 +755,27 @@ static inline void efx_ptp_process_rx(struct efx_nic *efx, struct sk_buff *skb)
	local_bh_enable();
	local_bh_enable();
}
}


static int efx_ptp_start(struct efx_nic *efx)
static void efx_ptp_remove_multicast_filters(struct efx_nic *efx)
{
	struct efx_ptp_data *ptp = efx->ptp_data;

	if (ptp->rxfilter_installed) {
		efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
					  ptp->rxfilter_general);
		efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
					  ptp->rxfilter_event);
		ptp->rxfilter_installed = false;
	}
}

static int efx_ptp_insert_multicast_filters(struct efx_nic *efx)
{
{
	struct efx_ptp_data *ptp = efx->ptp_data;
	struct efx_ptp_data *ptp = efx->ptp_data;
	struct efx_filter_spec rxfilter;
	struct efx_filter_spec rxfilter;
	int rc;
	int rc;


	ptp->reset_required = false;
	if (ptp->rxfilter_installed)
		return 0;


	/* Must filter on both event and general ports to ensure
	/* Must filter on both event and general ports to ensure
	 * that there is no packet re-ordering.
	 * that there is no packet re-ordering.
@@ -794,23 +808,37 @@ static int efx_ptp_start(struct efx_nic *efx)
		goto fail;
		goto fail;
	ptp->rxfilter_general = rc;
	ptp->rxfilter_general = rc;


	ptp->rxfilter_installed = true;
	return 0;

fail:
	efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
				  ptp->rxfilter_event);
	return rc;
}

static int efx_ptp_start(struct efx_nic *efx)
{
	struct efx_ptp_data *ptp = efx->ptp_data;
	int rc;

	ptp->reset_required = false;

	rc = efx_ptp_insert_multicast_filters(efx);
	if (rc)
		return rc;

	rc = efx_ptp_enable(efx);
	rc = efx_ptp_enable(efx);
	if (rc != 0)
	if (rc != 0)
		goto fail2;
		goto fail;


	ptp->evt_frag_idx = 0;
	ptp->evt_frag_idx = 0;
	ptp->current_adjfreq = 0;
	ptp->current_adjfreq = 0;
	ptp->rxfilter_installed = true;


	return 0;
	return 0;


fail2:
	efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
				  ptp->rxfilter_general);
fail:
fail:
	efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
	efx_ptp_remove_multicast_filters(efx);
				  ptp->rxfilter_event);

	return rc;
	return rc;
}
}


@@ -826,13 +854,7 @@ static int efx_ptp_stop(struct efx_nic *efx)


	rc = efx_ptp_disable(efx);
	rc = efx_ptp_disable(efx);


	if (ptp->rxfilter_installed) {
	efx_ptp_remove_multicast_filters(efx);
		efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
					  ptp->rxfilter_general);
		efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
					  ptp->rxfilter_event);
		ptp->rxfilter_installed = false;
	}


	/* Make sure RX packets are really delivered */
	/* Make sure RX packets are really delivered */
	efx_ptp_deliver_rx_queue(&efx->ptp_data->rxq);
	efx_ptp_deliver_rx_queue(&efx->ptp_data->rxq);