sfc: Split PTP multicast filter insertion/removal out of efx_ptp_{start,stop}()
authorBen Hutchings <bhutchings@solarflare.com>
Tue, 15 Oct 2013 16:54:56 +0000 (17:54 +0100)
committerBen Hutchings <bhutchings@solarflare.com>
Thu, 12 Dec 2013 22:07:01 +0000 (22:07 +0000)
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/ptp.c

index 24bd2e3040f8d6ecd7f0e0ec333dba7fdb52c6ae..7ae66d9002562e6a553ebf376656993664e5a364 100644 (file)
@@ -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);