|
@@ -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;
|
|
|
|
|
|
+ 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;
|
|
|
}
|
|
|
|
|
@@ -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);
|