• Ben Hutchings's avatar
    sfc: Fix two causes of flush failure · 354a9f6d
    Ben Hutchings authored
    [ Upstream commits a606f432,
      d5e8cc6c,
      525d9e82 ]
    
    The TX DMA engine issues upstream read requests when there is room in
    the TX FIFO for the completion. However, the fetches for the rest of
    the packet might be delayed by any back pressure.  Since a flush must
    wait for an EOP, the entire flush may be delayed by back pressure.
    
    Mitigate this by disabling flow control before the flushes are
    started.  Since PF and VF flushes run in parallel introduce
    fc_disable, a reference count of the number of flushes outstanding.
    
    The same principle could be applied to Falcon, but that
    would bring with it its own testing.
    
    We sometimes hit a "failed to flush" timeout on some TX queues, but the
    flushes have completed and the flush completion events seem to go missing.
    In this case, we can check the TX_DESC_PTR_TBL register and drain the
    queues if the flushes had finished.
    Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
    [bwh: Backported to 3.2:
     - Call efx_nic_type::finish_flush() on both success and failure paths
     - Check the TX_DESC_PTR_TBL registers in the polling loop
     - Declare efx_mcdi_set_mac() extern]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    354a9f6d
mcdi_mac.c 3.76 KB