Skip to contentSkip to conversation

tmio_mmc: Make ack_mmc_irqs() write-only

PATCH In review Yusuke Goda 3 participants 4 messages Jul 20, 2010 – Aug 20, 2010

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

---
 drivers/mmc/host/tmio_mmc.h |    5 +----
 1 files changed, 1 insertions(+), 4 deletions(-)
drivers/mmc/host/tmio_mmc.h +1 -4
index 64f7d5d..7944604 100644
@@ -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)
 
 
Signature · 1 line
1.7.0
Acked-by on v1 1/1
#1 lore raw

2010/7/20 Yusuke Goda <[email protected]>:

Quoted 8 lines

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.

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

Tested-by on v1 1/1
#2 lore raw
In reply to Yusuke Goda

Am 20.07.2010 09:51, schrieb Yusuke Goda:

Quoted 8 lines

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.

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

Acked-by Tested-by Arnd Hannemann
#3 lore raw
Quoted 8 lines · Arnd Hannemann

Am 20.07.2010 09:51, schrieb Yusuke Goda:

Quoted 7 lines

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.

Quoted 5 lines
Quoted 1 line

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

Thanks, Arnd!

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

At the current point this patch has:

Ian Molton also gave his "Acked-by" in a different email thread, please see below:

Quoted 13 lines · Ian Molton

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.

Quoted 8 lines

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,

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

/ magnus