• Lennert Buytenhek's avatar
    mv643xx_eth: prevent breakage when link goes down during transmit · 6b368f68
    Lennert Buytenhek authored
    When the ethernet link goes down while mv643xx_eth is transmitting
    data, transmit DMA can stop before all queued transmit descriptors
    have been processed.  But even the descriptors that _have_ been
    processed might not be properly marked as done before the transmit
    DMA unit shuts down.
    
    Then when the link comes up again, the hardware transmit pointer
    might have advanced while not all previous packet descriptors have
    been marked as transmitted, causing software transmit reclaim to
    hang waiting for the hardware to finish transmitting a descriptor
    that it has already skipped.
    
    This patch forcibly reclaims all packets on the transmit ring on a
    link down interrupt, and then resyncs the hardware transmit pointer to
    what the software's idea of the first free descriptor is.  Also, we
    need to prevent re-waking the transmit queue if we get a 'transmit
    done' interrupt at the same time as a 'link down' interrupt, which
    this patch does as well.
    Signed-off-by: default avatarLennert Buytenhek <buytenh@marvell.com>
    6b368f68
mv643xx_eth.c 62.9 KB