arch/xtensa/src/esp32s3/esp32s3_sdmmc.c: wait for command done event also on error response
Wait for CMDDONE in esp32s3_waitresponse even an error response is received.
Otherwise, the CMDDONE event of this command will disrupt later command.
Signed-off-by: Yinzhe Wu <Yinzhe.Wu@sony.com>
Reviewed-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Reviewed-by: Jacky Cao <Jacky.Cao@sony.com>
Tested-by: Yinzhe Wu <Yinzhe.Wu@sony.com>
diff --git a/arch/xtensa/src/esp32s3/esp32s3_sdmmc.c b/arch/xtensa/src/esp32s3/esp32s3_sdmmc.c
index e643477..a38e5ea 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_sdmmc.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_sdmmc.c
@@ -143,7 +143,6 @@
#endif
#define SDCARD_CMDDONE_STA (SDMMC_INT_CDONE)
-#define SDCARD_RESPDONE_STA (0)
#define SDCARD_CMDDONE_MASK (SDMMC_INT_CDONE)
#define SDCARD_RESPDONE_MASK (SDMMC_INT_CDONE | SDCARD_INT_RESPERR)
@@ -521,8 +520,6 @@
{
clock_t watchtime;
- DEBUGASSERT((esp32s3_getreg(ESP32S3_SDMMC_CMD) & SDMMC_CMD_STARTCMD) == 0);
-
watchtime = clock_systime_ticks();
while ((esp32s3_getreg(ESP32S3_SDMMC_CMD) & SDMMC_CMD_STARTCMD) != 0)
@@ -544,8 +541,6 @@
mcinfo("cmd=0x%x arg=0x%x\n", cmd, arg);
- /* Poll until command is accepted by the CIU, or we timeout */
-
return 0;
}
@@ -1991,16 +1986,17 @@
static int esp32s3_waitresponse(struct sdio_dev_s *dev, uint32_t cmd)
{
+ int ret = OK;
volatile int32_t timeout;
clock_t watchtime;
- uint32_t events;
mcinfo("cmd=%04x\n", cmd);
switch (cmd & MMCSD_RESPONSE_MASK)
{
case MMCSD_NO_RESPONSE:
- events = SDCARD_CMDDONE_STA;
+ case MMCSD_R3_RESPONSE:
+ case MMCSD_R7_RESPONSE:
timeout = SDCARD_CMDTIMEOUT;
break;
@@ -2010,48 +2006,41 @@
case MMCSD_R4_RESPONSE:
case MMCSD_R5_RESPONSE:
case MMCSD_R6_RESPONSE:
- events = (SDCARD_CMDDONE_STA | SDCARD_RESPDONE_STA);
timeout = SDCARD_LONGTIMEOUT;
break;
- case MMCSD_R3_RESPONSE:
- case MMCSD_R7_RESPONSE:
- events = (SDCARD_CMDDONE_STA | SDCARD_RESPDONE_STA);
- timeout = SDCARD_CMDTIMEOUT;
- break;
-
default:
return -EINVAL;
}
- /* Then wait for the response (or timeout or error) */
-
watchtime = clock_systime_ticks();
- while ((esp32s3_getreg(ESP32S3_SDMMC_RINTSTS) & events) != events)
+
+ /* We should wait for CMDDONE, even if there is a response error. */
+
+ while ((esp32s3_getreg(ESP32S3_SDMMC_RINTSTS) & SDMMC_INT_CDONE) == 0)
{
if (clock_systime_ticks() - watchtime > timeout)
{
- mcerr("ERROR: Timeout cmd: %04x events: %04x STA: %08x "
- "RINTSTS: %08x\n",
- cmd, events, esp32s3_getreg(ESP32S3_SDMMC_STATUS),
+ mcerr("ERROR: Timeout cmd: %04x STA: %08x RINTSTS: %08x\n",
+ cmd, esp32s3_getreg(ESP32S3_SDMMC_STATUS),
esp32s3_getreg(ESP32S3_SDMMC_RINTSTS));
- return -ETIMEDOUT;
- }
- else if ((esp32s3_getreg(ESP32S3_SDMMC_RINTSTS) & SDCARD_INT_RESPERR)
- != 0)
- {
- mcerr("ERROR: SDMMC failure cmd: %04x events: %04x STA: %08x "
- "RINTSTS: %08x\n",
- cmd, events, esp32s3_getreg(ESP32S3_SDMMC_STATUS),
- esp32s3_getreg(ESP32S3_SDMMC_RINTSTS));
-
- return -EIO;
+ ret = -ETIMEDOUT;
}
}
+ /* Check if there is a response error. */
+
+ if (esp32s3_getreg(ESP32S3_SDMMC_RINTSTS) & SDCARD_INT_RESPERR)
+ {
+ mcerr("ERROR: SDMMC failure cmd: %04x STA: %08x RINTSTS: %08x\n",
+ cmd, esp32s3_getreg(ESP32S3_SDMMC_STATUS),
+ esp32s3_getreg(ESP32S3_SDMMC_RINTSTS));
+ ret = -EIO;
+ }
+
esp32s3_putreg(SDCARD_CMDDONE_CLEAR, ESP32S3_SDMMC_RINTSTS);
- return OK;
+ return ret;
}
/****************************************************************************