From: Bin Meng Date: Mon, 10 Nov 2025 11:05:07 +0000 (+0800) Subject: hw/sd: Fix ACMD41 state machine in SPI mode X-Git-Tag: v10.2.0-rc1~4^2~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=40260d3ea67cc5cdf20553be24353680d70b1b6c;p=thirdparty%2Fqemu.git hw/sd: Fix ACMD41 state machine in SPI mode In SPI mode, the ACMD41 argument only defines bit 30 (HCS); all other bits are reserved. The current implementation incorrectly checks the voltage window bits even in SPI mode, preventing the state machine from transitioning to the READY state. As a result, the U-Boot mmc-spi driver falls into an endless CMD55/ACMD41 loop. Fixes: 3241a61a ("hw/sd/sdcard: Use complete SEND_OP_COND implementation in SPI mode") Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2945 Reported-by: Tom Rini Signed-off-by: Bin Meng Reviewed-by: Philippe Mathieu-Daudé Message-ID: <20251110110507.1641042-3-bmeng.cn@gmail.com> Signed-off-by: Philippe Mathieu-Daudé --- diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 5aae541363..df5a36fad9 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -2289,20 +2289,21 @@ static sd_rsp_type_t sd_cmd_SEND_OP_COND(SDState *sd, SDRequest req) } } - if (FIELD_EX32(sd->ocr & req.arg, OCR, VDD_VOLTAGE_WINDOW)) { - /* - * We accept any voltage. 10000 V is nothing. - * - * Once we're powered up, we advance straight to ready state - * unless it's an enquiry ACMD41 (bits 23:0 == 0). - */ - sd->state = sd_ready_state; - } - if (sd_is_spi(sd)) { + sd->state = sd_ready_state; return sd_r1; + } else { + if (FIELD_EX32(sd->ocr & req.arg, OCR, VDD_VOLTAGE_WINDOW)) { + /* + * We accept any voltage. 10000 V is nothing. + * + * Once we're powered up, we advance straight to ready state + * unless it's an enquiry ACMD41 (bits 23:0 == 0). + */ + sd->state = sd_ready_state; + } + return sd_r3; } - return sd_r3; } /* ACMD42 */