Skip to content

Commit

Permalink
sfc: Split PTP multicast filter insertion/removal out of efx_ptp_{sta…
Browse files Browse the repository at this point in the history
…rt,stop}()

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
  • Loading branch information
Ben Hutchings committed Dec 12, 2013
1 parent 065e64c commit 62a1c70
Showing 1 changed file with 39 additions and 17 deletions.
56 changes: 39 additions & 17 deletions drivers/net/ethernet/sfc/ptp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -794,23 +808,37 @@ static int efx_ptp_start(struct efx_nic *efx)
goto fail;
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);
if (rc != 0)
goto fail2;
goto fail;

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);

efx_ptp_remove_multicast_filters(efx);
return rc;
}

Expand All @@ -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);
Expand Down

0 comments on commit 62a1c70

Please sign in to comment.