At idle state, prior initialization, MMC cards (not SD) will respond with illegal command to anything other than CMD1 (MMC_SEND_OP_COND) and CMD58 (MMC_READ_OCR). The MMC driver initially sends CMD8 (SD_SEND_IF_COND) to check for an SD card, but this needs to return an error, if not an SD card, so it can later check for an MMC card with CMD1 (MMC_SEND_OP_COND).
Additionally, CMD55 + ACMD41 (SD_APP_SEND_OP_COND) can be skipped if CMD8 (SD_SEND_IF_COND) already failed. Signed-off-by: Martí Alonso <[email protected]> --- drivers/mmc/mmc.c | 18 ++++++++++-------- drivers/mmc/mmc_spi.c | 3 +++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index f0e38efb262b..27eed9a76ba2 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -3014,16 +3014,18 @@ retry: /* Test for SD version 2 */ err = mmc_send_if_cond(mmc); - /* Now try to get the SD card's operating condition */ - err = sd_send_op_cond(mmc, uhs_en); - if (err && uhs_en) { - uhs_en = false; - mmc_power_cycle(mmc); - goto retry; + if (!err) { + /* Now try to get the SD card's operating condition */ + err = sd_send_op_cond(mmc, uhs_en); + if (err && uhs_en) { + uhs_en = false; + mmc_power_cycle(mmc); + goto retry; + } } - /* If the command timed out, we check for an MMC card */ - if (err == -ETIMEDOUT) { + /* If the command timed out or returned illegal, we check for an MMC card */ + if (err == -ETIMEDOUT || err == -EOPNOTSUPP) { err = mmc_send_op_cond(mmc); if (err) { diff --git a/drivers/mmc/mmc_spi.c b/drivers/mmc/mmc_spi.c index 675e642efd08..53bf4f583243 100644 --- a/drivers/mmc/mmc_spi.c +++ b/drivers/mmc/mmc_spi.c @@ -168,6 +168,9 @@ static int mmc_spi_sendcmd(struct udevice *dev, return -ETIMEDOUT; } + if (resp[0] & R1_SPI_ILLEGAL_COMMAND) + return -EOPNOTSUPP; + debug("\n"); return 0; -- 2.43.0 base-commit: 5ca1a73c7d3064582498a8aa96c29e714402a6d3 branch: fix-mmc-no-sd

