]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
sdcard: Check for error events during sdcard_pio()
authorKevin O'Connor <kevin@koconnor.net>
Wed, 12 Aug 2015 16:07:17 +0000 (12:07 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Mon, 17 Aug 2015 16:11:24 +0000 (12:11 -0400)
Check for command errors and clear the error status if an error is
found.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
src/hw/sdcard.c

index 5f9ce4a8797f2a7a5049144086a95f59f8750d4b..1f2629123b7988dd0734ad9932219cd0edc6262e 100644 (file)
@@ -79,6 +79,7 @@ struct sdhci_s {
 #define SI_TRANS_DONE   (1<<1)
 #define SI_WRITE_READY  (1<<4)
 #define SI_READ_READY   (1<<5)
+#define SI_ERROR        (1<<15)
 
 // SDHCI present_state flags
 #define SP_CMD_INHIBIT   (1<<0)
@@ -186,9 +187,16 @@ sdcard_pio(struct sdhci_s *regs, int cmd, u32 *param)
     // Send command
     writel(&regs->arg, *param);
     writew(&regs->cmd, cmd);
-    int ret = sdcard_waitw(&regs->irq_status, SI_CMD_COMPLETE);
+    int ret = sdcard_waitw(&regs->irq_status, SI_ERROR|SI_CMD_COMPLETE);
     if (ret < 0)
         return ret;
+    if (ret & SI_ERROR) {
+        u16 err = readw(&regs->error_irq_status);
+        dprintf(3, "sdcard_pio command stop (code=%x)\n", err);
+        sdcard_reset(regs, SRF_CMD|SRF_DATA);
+        writew(&regs->error_irq_status, err);
+        return -1;
+    }
     writew(&regs->irq_status, SI_CMD_COMPLETE);
     // Read response
     memcpy(param, regs->response, sizeof(regs->response));
@@ -424,8 +432,11 @@ sdcard_controller_setup(void *data)
             , readl(&regs->cap_lo), readl(&regs->cap_hi));
     sdcard_reset(regs, SRF_ALL);
     writew(&regs->irq_signal, 0);
-    writew(&regs->irq_enable, 0xffff);
+    writew(&regs->irq_enable, 0x01ff);
+    writew(&regs->irq_status, readw(&regs->irq_status));
     writew(&regs->error_signal, 0);
+    writew(&regs->error_irq_enable, 0x03ff);
+    writew(&regs->error_irq_status, readw(&regs->error_irq_status));
     writeb(&regs->timeout_control, 0x0e); // Set to max timeout
     int volt = sdcard_set_power(regs);
     if (volt < 0)