diff options
Diffstat (limited to 'drivers/net/ethernet/sfc/farch.c')
-rw-r--r-- | drivers/net/ethernet/sfc/farch.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/net/ethernet/sfc/farch.c b/drivers/net/ethernet/sfc/farch.c index a08761360cdf..0537381cd2f6 100644 --- a/drivers/net/ethernet/sfc/farch.c +++ b/drivers/net/ethernet/sfc/farch.c | |||
@@ -741,6 +741,28 @@ int efx_farch_fini_dmaq(struct efx_nic *efx) | |||
741 | return rc; | 741 | return rc; |
742 | } | 742 | } |
743 | 743 | ||
744 | /* Reset queue and flush accounting after FLR | ||
745 | * | ||
746 | * One possible cause of FLR recovery is that DMA may be failing (eg. if bus | ||
747 | * mastering was disabled), in which case we don't receive (RXQ) flush | ||
748 | * completion events. This means that efx->rxq_flush_outstanding remained at 4 | ||
749 | * after the FLR; also, efx->active_queues was non-zero (as no flush completion | ||
750 | * events were received, and we didn't go through efx_check_tx_flush_complete()) | ||
751 | * If we don't fix this up, on the next call to efx_realloc_channels() we won't | ||
752 | * flush any RX queues because efx->rxq_flush_outstanding is at the limit of 4 | ||
753 | * for batched flush requests; and the efx->active_queues gets messed up because | ||
754 | * we keep incrementing for the newly initialised queues, but it never went to | ||
755 | * zero previously. Then we get a timeout every time we try to restart the | ||
756 | * queues, as it doesn't go back to zero when we should be flushing the queues. | ||
757 | */ | ||
758 | void efx_farch_finish_flr(struct efx_nic *efx) | ||
759 | { | ||
760 | atomic_set(&efx->rxq_flush_pending, 0); | ||
761 | atomic_set(&efx->rxq_flush_outstanding, 0); | ||
762 | atomic_set(&efx->active_queues, 0); | ||
763 | } | ||
764 | |||
765 | |||
744 | /************************************************************************** | 766 | /************************************************************************** |
745 | * | 767 | * |
746 | * Event queue processing | 768 | * Event queue processing |