• Lennert Buytenhek's avatar
    mv643xx_eth: fix TX hang erratum workaround · 8fa89bf5
    Lennert Buytenhek authored
    The previously merged TX hang erratum workaround ("mv643xx_eth:
    work around TX hang hardware issue") assumes that TX_END interrupts
    are delivered simultaneously with or after their corresponding TX
    interrupts, but this is not always true in practise.
    
    In particular, it appears that TX_END interrupts are issued as soon
    as descriptor fetch returns an invalid descriptor, which may happen
    before earlier descriptors have been fully transmitted and written
    back to memory as being done.
    
    This hardware behavior can lead to a situation where the current
    driver code mistakenly assumes that the MAC has given up transmitting
    before noticing the packets that it is in fact still currently working
    on, causing the driver to re-kick the transmit queue, which will only
    cause the MAC to re-fetch the invalid head descriptor, and generate
    another TX_END interrupt, et cetera, until the packets in the pipe
    finally finish transmitting and have their descriptors written back
    to memory, which will then finally break the loop.
    
    Fix this by having the erratum workaround not check the 'number of
    unfinished descriptor', but instead, to compare the software's idea
    of what the head descriptor pointer should be to the hardware's head
    descriptor pointer (which is updated on the same conditions as the
    TX_END interupt is generated on, i.e. possibly before all previous
    descriptors have been transmitted and written back).
    Signed-off-by: default avatarLennert Buytenhek <buytenh@marvell.com>
    8fa89bf5
mv643xx_eth.c 62.6 KB