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

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

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent 065e64c4
...@@ -755,13 +755,27 @@ static inline void efx_ptp_process_rx(struct efx_nic *efx, struct sk_buff *skb) ...@@ -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) ...@@ -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) ...@@ -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);
......
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