Loading drivers/net/ethernet/sfc/ptp.c +39 −17 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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; } Loading @@ -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); Loading Loading
drivers/net/ethernet/sfc/ptp.c +39 −17 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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; } Loading @@ -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); Loading