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 <[email protected]>
---

 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

Reply via email to