Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> --- hw/sd/sd.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 2eca999bc3..07424aa56e 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -1390,9 +1390,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) /* Application specific commands (Class 8) */ case 55: /* CMD55: APP_CMD */ - if (sd->rca != rca) - return sd_r0; - + if (!sd->spi) { + if (sd->rca != rca) { + return sd_r0; + } + } sd->expecting_acmd = true; sd->card_status |= APP_CMD; return sd_r1; @@ -1412,6 +1414,18 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) } break; + case 58: /* CMD58: READ_OCR (SPI) */ + if (!sd->spi) { + goto bad_cmd; + } + return sd_r3; + + case 59: /* CMD59: CRC_ON_OFF (SPI) */ + if (!sd->spi) { + goto bad_cmd; + } + goto unimplemented_cmd; + default: bad_cmd: qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd); @@ -1436,6 +1450,9 @@ static sd_rsp_type_t sd_app_command(SDState *sd, sd->card_status |= APP_CMD; switch (req.cmd) { case 6: /* ACMD6: SET_BUS_WIDTH */ + if (sd->spi) { + goto unimplemented_cmd; + } switch (sd->state) { case sd_transfer_state: sd->sd_status[0] &= 0x3f; @@ -1460,6 +1477,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd, } break; + case 18: + if (sd->spi) { + goto unimplemented_cmd; + } + break; + case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */ switch (sd->state) { case sd_transfer_state: @@ -1485,6 +1508,19 @@ static sd_rsp_type_t sd_app_command(SDState *sd, } break; + case 25: + case 26: + if (sd->spi) { + goto unimplemented_cmd; + } + break; + + case 38: + if (sd->spi) { + goto unimplemented_cmd; + } + break; + case 41: /* ACMD41: SD_APP_OP_COND */ if (sd->spi) { /* SEND_OP_CMD */ @@ -1542,6 +1578,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd, } break; + case 43 ... 49: + if (sd->spi) { + goto unimplemented_cmd; + } + break; + case 51: /* ACMD51: SEND_SCR */ switch (sd->state) { case sd_transfer_state: @@ -1555,9 +1597,18 @@ static sd_rsp_type_t sd_app_command(SDState *sd, } break; + case 55: /* Not exist */ + break; + default: /* Fall back to standard commands. */ return sd_normal_command(sd, req); + + unimplemented_cmd: + /* Commands that are recognised but not yet implemented in SPI mode. */ + qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n", + req.cmd); + return sd_illegal; } qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd); -- 2.15.1