[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