2010-07-20 07:53:50

by Yusuke Goda

[permalink] [raw]
Subject: [PATCH] tmio_mmc: Make ack_mmc_irqs() write-only

This patch updates ack_mmc_irqs() to acknowledge using write instead
of read-modify-write. Without this fix the old read-modify-write
implementation may acknowledge interrupt sources by mistake. The
driver may if so lock-up waiting forever for an interrupt that will
never come. Observed with the TMIO_STAT_RXRDY bit together with CMD53
on AR6002 and BCM4318 SDIO cards in polled mode.

Signed-off-by: Yusuke Goda <[email protected]>
---
drivers/mmc/host/tmio_mmc.h | 5 +----
1 files changed, 1 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h
index 64f7d5d..7944604 100644
--- a/drivers/mmc/host/tmio_mmc.h
+++ b/drivers/mmc/host/tmio_mmc.h
@@ -82,10 +82,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)


--
1.7.0



2010-07-23 11:10:12

by Magnus Damm

[permalink] [raw]
Subject: Re: [PATCH] tmio_mmc: Make ack_mmc_irqs() write-only

2010/7/20 Yusuke Goda <[email protected]>:
> This patch updates ack_mmc_irqs() to acknowledge using write instead
> of read-modify-write. Without this fix the old read-modify-write
> implementation may acknowledge interrupt sources by mistake. The
> driver may if so lock-up waiting forever for an interrupt that will
> never come. Observed with the TMIO_STAT_RXRDY bit together with CMD53
> on AR6002 and BCM4318 SDIO cards in polled mode.
>
> Signed-off-by: Yusuke Goda <[email protected]>

Simple testing with a BCM4318 card and a MMC card on sh7372 and SDHI
shows no problems.

Acked-by: Magnus Damm <[email protected]>

2010-08-20 15:12:58

by Arnd Hannemann

[permalink] [raw]
Subject: Re: [PATCH] tmio_mmc: Make ack_mmc_irqs() write-only

Am 20.07.2010 09:51, schrieb Yusuke Goda:
> This patch updates ack_mmc_irqs() to acknowledge using write instead
> of read-modify-write. Without this fix the old read-modify-write
> implementation may acknowledge interrupt sources by mistake. The
> driver may if so lock-up waiting forever for an interrupt that will
> never come. Observed with the TMIO_STAT_RXRDY bit together with
> CMD53 on AR6002 and BCM4318 SDIO cards in polled mode.
>
> Signed-off-by: Yusuke Goda <[email protected]>

Tested on AP4EVB (sh7372) with SDHC and MMC cards - no regression.

Tested-by: Arnd Hannemann <[email protected]>

2010-08-20 22:55:42

by Magnus Damm

[permalink] [raw]
Subject: Re: [PATCH] tmio_mmc: Make ack_mmc_irqs() write-only

On Sat, Aug 21, 2010 at 12:12 AM, Arnd Hannemann <[email protected]> wrote:
> Am 20.07.2010 09:51, schrieb Yusuke Goda:
>> This patch updates ack_mmc_irqs() to acknowledge using write instead
>> of read-modify-write. Without this fix the old read-modify-write
>> implementation may acknowledge interrupt sources by mistake. The
>> driver may if so lock-up waiting forever for an interrupt that will
>> never come. Observed with the TMIO_STAT_RXRDY bit together with
>> CMD53 on AR6002 and BCM4318 SDIO cards in polled mode.
>>
>> Signed-off-by: Yusuke Goda <[email protected]>
>
> Tested on AP4EVB (sh7372) with SDHC and MMC cards - no regression.
>
> Tested-by: Arnd Hannemann <[email protected]>

Thanks, Arnd!

Andrew, is there anything you need to (re)pick-up this patch?

At the current point this patch has:
Signed-off-by: Yusuke Goda <[email protected]>
Acked-by: Magnus Damm <[email protected]>
Tested-by: Arnd Hannemann <[email protected]>

Ian Molton also gave his "Acked-by" in a different email thread,
please see below:
On Tue, Jul 27, 2010 at 5:11 PM, Ian Molton <[email protected]> wrote:
> Right now, the docs in question are on my dead fileserver.
>
> Given that, I'll say two things:
>
> 1) Its safe to assume anywhere that does a RMW does it because my
> original docs said so. I dont recall having ever "just done it because
> I had to" when I wrote this.
> 2) The code as is is clearly broken.
>
> I'm not really sure what to do about this. It got made 'doubly broken'
> when we added asic3 support because it was the first platform added
> where you couldnt just do a 32 bit RMW on the pair of registers.
>
> I'm inclined to say "Go Go Go" and see if anything breaks on this one.
> I cant see why the docs want it to be RMW as theres nothing stopping
> the hardware asserting an IRQ even if the CPU disables IRQs / did the
> RMW as an atomic op.
>
> This one therefore,
>
> Acked-by: Ian Molton <[email protected]>

Thanks for the help everyone and sorry about the confused state of things.

/ magnus