[SeaBIOS] [PATCH 07/14] sdcard: The card should never be in a busy state at start of sdcard_pio()

Kevin O'Connor kevin at koconnor.net
Wed Aug 12 20:03:28 CET 2015


Return an error if the controller is busy at the start of a command
instead of waiting.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/hw/sdcard.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/hw/sdcard.c b/src/hw/sdcard.c
index 4dd93cb..4cec423 100644
--- a/src/hw/sdcard.c
+++ b/src/hw/sdcard.c
@@ -157,15 +157,18 @@ waitw(u16 *reg, u16 mask, u16 value, u32 end)
 static int
 sdcard_pio(struct sdhci_s *regs, int cmd, u32 *param)
 {
-    u32 end = timer_calc(SDHCI_PIO_TIMEOUT);
-    u16 busyf = SP_CMD_INHIBIT | ((cmd & 0x03) == 0x03 ? SP_DAT_INHIBIT : 0);
-    int ret = waitw((u16*)&regs->present_state, busyf, 0, end);
-    if (ret)
-        return ret;
+    u32 state = readl(&regs->present_state);
+    dprintf(9, "sdcard_pio cmd %x %x %x\n", cmd, *param, state);
+    if ((state & SP_CMD_INHIBIT)
+        || ((cmd & 0x03) == 0x03 && state & SP_DAT_INHIBIT)) {
+        dprintf(1, "sdcard_pio not ready %x\n", state);
+        return -1;
+    }
     // Send command
     writel(&regs->arg, *param);
     writew(&regs->cmd, cmd);
-    ret = waitw(&regs->irq_status, SI_CMD_COMPLETE, SI_CMD_COMPLETE, end);
+    u32 end = timer_calc(SDHCI_PIO_TIMEOUT);
+    int ret = waitw(&regs->irq_status, SI_CMD_COMPLETE, SI_CMD_COMPLETE, end);
     if (ret)
         return ret;
     writew(&regs->irq_status, SI_CMD_COMPLETE);
-- 
1.9.3




More information about the SeaBIOS mailing list