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:
@@ -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;
|
||||||
|
|
||||||
rc = efx_ptp_enable(efx);
|
|
||||||
if (rc != 0)
|
|
||||||
goto fail2;
|
|
||||||
|
|
||||||
ptp->evt_frag_idx = 0;
|
|
||||||
ptp->current_adjfreq = 0;
|
|
||||||
ptp->rxfilter_installed = true;
|
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_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
|
||||||
ptp->rxfilter_event);
|
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;
|
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);
|
||||||
|
Reference in New Issue
Block a user