• Paul Parsons's avatar
    mmc: tmio: Fix race condition resulting in spurious interrupts · e312eb1e
    Paul Parsons authored
    There is a race condition in the tmio_mmc_irq() interrupt handler,
    caused by the presence of a while loop, which results in warnings of
    spurious interrupts. This was found on an HP iPAQ hx4700 whose HTC
    ASIC3 reportedly incorporates the Toshiba TC6380AF controller.
    
    Towards the end of a multiple read (CMD18) operation the handler clears
    the final RXRDY status bit in the first loop iteration, sees the DATAEND
    status bit at the bottom of the loop, and so clears the DATAEND status
    bit in the second loop iteration. However the DATAEND interrupt is still
    queued in the system somewhere and can't be delivered until the handler
    has returned. This second interrupt is then reported as spurious in the
    next call to the handler. Likewise for single read (CMD17) operations.
    And something similar occurs for multiple write (CMD25) and single write
    (CMD24) operations, where CMDRESPEND and TXRQ status bits are cleared in
    a single call.
    
    In these cases the interrupt handler clears two separate interrupts when
    it should only clear the one interrupt for which it was invoked. The fix
    is to remove the while loop.
    Signed-off-by: default avatarPaul Parsons <lost.distance@yahoo.com>
    Signed-off-by: default avatarChris Ball <cjb@laptop.org>
    e312eb1e
tmio_mmc_pio.c 25.5 KB