[PATCH 2/2] mmc: handle MMC_SEND_EXT_CSD/SD_SEND_IF_COND collision in SPI mode
Martí Alonso
martialonso11 at gmail.com
Sun Jun 14 02:04:38 CEST 2026
Both MMC and SD use index 8 for different commands, and expect different
types of responses. MMC_CMD_SEND_EXT_CSD expects a data block of 512
bytes while SD_CMD_SEND_IF_COND expects an R7 response (R1 + 32 bits).
Differentiate them with the data parameter which tells us if the MMC
driver expects a data block as a response.
Signed-off-by: Martí Alonso <martialonso11 at gmail.com>
---
drivers/mmc/mmc_spi.c | 29 +++++++++++++++++++----------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/drivers/mmc/mmc_spi.c b/drivers/mmc/mmc_spi.c
index 53bf4f583243..f13ae8e6ebcd 100644
--- a/drivers/mmc/mmc_spi.c
+++ b/drivers/mmc/mmc_spi.c
@@ -339,11 +339,16 @@ static int dm_mmc_spi_request(struct udevice *dev, struct mmc_cmd *cmd,
resp_size = sizeof(resp8);
cmd->cmdarg = 0x40000000;
break;
- case SD_CMD_SEND_IF_COND:
- resp = (u8 *)&resp40[0];
- resp_size = sizeof(resp40);
- resp_match = true;
- resp_match_value = R1_SPI_IDLE;
+ case SD_CMD_SEND_IF_COND: // Also MMC_CMD_SEND_EXT_CSD
+ if (data) {
+ resp = &resp8;
+ resp_size = sizeof(resp8);
+ } else {
+ resp = (u8 *)&resp40[0];
+ resp_size = sizeof(resp40);
+ resp_match = true;
+ resp_match_value = R1_SPI_IDLE;
+ }
break;
case MMC_CMD_SPI_READ_OCR:
resp = (u8 *)&resp40[0];
@@ -396,12 +401,16 @@ static int dm_mmc_spi_request(struct udevice *dev, struct mmc_cmd *cmd,
case MMC_CMD_SEND_OP_COND:
cmd->response[0] = (resp8 & R1_SPI_IDLE) ? 0 : OCR_BUSY;
break;
- case SD_CMD_SEND_IF_COND:
+ case SD_CMD_SEND_IF_COND: // Also MMC_CMD_SEND_EXT_CSD
case MMC_CMD_SPI_READ_OCR:
- cmd->response[0] = resp40[4];
- cmd->response[0] |= (uint)resp40[3] << 8;
- cmd->response[0] |= (uint)resp40[2] << 16;
- cmd->response[0] |= (uint)resp40[1] << 24;
+ if (data && cmd->cmdidx == MMC_CMD_SEND_EXT_CSD) {
+ cmd->response[0] = resp8;
+ } else {
+ cmd->response[0] = resp40[4];
+ cmd->response[0] |= (uint)resp40[3] << 8;
+ cmd->response[0] |= (uint)resp40[2] << 16;
+ cmd->response[0] |= (uint)resp40[1] << 24;
+ }
break;
case MMC_CMD_SEND_STATUS:
if (resp16[0] || resp16[1])
--
2.43.0
base-commit: 5ca1a73c7d3064582498a8aa96c29e714402a6d3
branch: fix-mmc-no-sd
More information about the U-Boot
mailing list