[lkml]   [2010]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[049/123] tmio_mmc: dont clear unhandled pending interrupts
    From: Yusuke Goda <>

    commit b78d6c5f51935ba89df8db33a57bacb547aa7325 upstream.

    Previously, it was possible for ack_mmc_irqs() to clear pending interrupt
    bits in the CTL_STATUS register, even though the interrupt handler had not
    been called. This was because of a race that existed when doing a
    read-modify-write sequence on CTL_STATUS. After the read step in this
    sequence, if an interrupt occurred (causing one of the bits in CTL_STATUS
    to be set) the write step would inadvertently clear it.

    Observed with the TMIO_STAT_RXRDY bit together with CMD53 on AR6002 and
    BCM4318 SDIO cards in polled mode.

    This patch eliminates this race by only writing to CTL_STATUS and clearing
    the interrupts that were passed as an argument to ack_mmc_irqs()."

    [ rewrote changelog]
    Signed-off-by: Yusuke Goda <>
    Acked-by: Magnus Damm <>
    Tested-by: Arnd Hannemann <>
    Acked-by: Ian Molton <>
    Cc: Matt Fleming <>
    Cc: Samuel Ortiz <>
    Cc: Paul Mundt <>
    Cc: <>
    Signed-off-by: Andrew Morton <>
    Signed-off-by: Linus Torvalds <>
    Signed-off-by: Greg Kroah-Hartman <>

    drivers/mmc/host/tmio_mmc.h | 5 +----
    1 file changed, 1 insertion(+), 4 deletions(-)

    --- a/drivers/mmc/host/tmio_mmc.h
    +++ b/drivers/mmc/host/tmio_mmc.h
    @@ -102,10 +102,7 @@

    #define ack_mmc_irqs(host, i) \
    do { \
    - u32 mask;\
    - mask = sd_ctrl_read32((host), CTL_STATUS); \
    - mask &= ~((i) & TMIO_MASK_IRQ); \
    - sd_ctrl_write32((host), CTL_STATUS, mask); \
    + sd_ctrl_write32((host), CTL_STATUS, ~(i)); \
    } while (0)

     \ /
      Last update: 2010-09-18 21:57    [W:0.019 / U:211.552 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site