[openfirmware] r1498 - dev/mmc/sdhci
svn at openfirmware.info
svn at openfirmware.info
Sun Nov 22 01:17:27 CET 2009
Author: wmb
Date: 2009-11-22 01:17:27 +0100 (Sun, 22 Nov 2009)
New Revision: 1498
Modified:
dev/mmc/sdhci/sdhci.fth
Log:
OLPC trac 9729 - fixed race condition in SDHCI interrupt-wait logic.
Modified: dev/mmc/sdhci/sdhci.fth
===================================================================
--- dev/mmc/sdhci/sdhci.fth 2009-11-21 23:50:51 UTC (rev 1497)
+++ dev/mmc/sdhci/sdhci.fth 2009-11-22 00:17:27 UTC (rev 1498)
@@ -321,13 +321,22 @@
: wait ( mask -- )
h# 8000 or ( mask' )
begin ( mask )
- isr@ dup isr! ( mask isr )
- 2dup and 0= while ( mask isr )
+ isr@ 2dup and ( mask isr mask&isr )
+ 0= while ( mask isr )
\ key? if key drop debug-me then ( mask isr )
\ DMA interrupt - the transfer crossed an address boundary
- 8 and if 0 cl@ 0 cl! then ( mask )
+ 8 and if 0 cl@ 0 cl! 8 isr! then ( mask )
repeat ( mask isr )
- nip ( isr )
+
+ \ Only clear the bits we will handle this time.
+ \ If additional ISR bits are set, leave them set because
+ \ later code will be waiting for them. In practice, the
+ \ only such additional bit is the "data transfer complete"
+ \ bit - mask 2 - which "2 wait" will handle.
+ \ But we do go ahead and clear card removal/insertion
+ \ events, because we don't handle them elsewhere.
+ swap h# c0 or over and isr! ( isr )
+
dup h# 8000 and if .sderror else drop then ( )
;
@@ -419,7 +428,14 @@
;
: deselect-card ( -- ) 0 h# 0700 0 cmd ; \ CMD7 - with null RCA
-: select-card ( -- ) rca h# 071b 0 cmd ; \ CMD7 R1b
+: select-card ( -- ) \ CMD7 R1b
+ rca h# 071b 0 cmd
+ \ In principle this shouldn't be necessary, but the Via VX855's SD
+ \ host controller incorrectly sets the "data transfer complete" bit
+ \ during CMD7 with nonzero RCA, and if you don't clear it, subsequent
+ \ commands sometimes fail with either Command Timeout or CRC error.
+ isr@ isr!
+;
: send-if-cond ( -- ) h# 1aa h# 081a 0 cmd ( response h# 1aa <> if ." Error" then ) ; \ CMD8 R7 (SD)
More information about the openfirmware
mailing list