sfc: Split PTP multicast filter insertion/removal out of efx_ptp_{start,stop}()
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
parent
065e64c4b2
commit
62a1c70356
|
@ -755,13 +755,27 @@ static inline void efx_ptp_process_rx(struct efx_nic *efx, struct sk_buff *skb)
|
|||
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_filter_spec rxfilter;
|
||||
int rc;
|
||||
|
||||
ptp->reset_required = false;
|
||||
if (ptp->rxfilter_installed)
|
||||
return 0;
|
||||
|
||||
/* Must filter on both event and general ports to ensure
|
||||
* that there is no packet re-ordering.
|
||||
|
@ -794,23 +808,37 @@ static int efx_ptp_start(struct efx_nic *efx)
|
|||
goto fail;
|
||||
ptp->rxfilter_general = rc;
|
||||
|
||||
rc = efx_ptp_enable(efx);
|
||||
if (rc != 0)
|
||||
goto fail2;
|
||||
|
||||
ptp->evt_frag_idx = 0;
|
||||
ptp->current_adjfreq = 0;
|
||||
ptp->rxfilter_installed = true;
|
||||
|
||||
return 0;
|
||||
|
||||
fail2:
|
||||
efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
|
||||
ptp->rxfilter_general);
|
||||
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);
|
||||
if (rc != 0)
|
||||
goto fail;
|
||||
|
||||
ptp->evt_frag_idx = 0;
|
||||
ptp->current_adjfreq = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
efx_ptp_remove_multicast_filters(efx);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -826,13 +854,7 @@ static int efx_ptp_stop(struct efx_nic *efx)
|
|||
|
||||
rc = efx_ptp_disable(efx);
|
||||
|
||||
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;
|
||||
}
|
||||
efx_ptp_remove_multicast_filters(efx);
|
||||
|
||||
/* Make sure RX packets are really delivered */
|
||||
efx_ptp_deliver_rx_queue(&efx->ptp_data->rxq);
|
||||
|
|
Loading…
Reference in New Issue