Message ID | 20180215221325.7611-13-f4bug@amsat.org |
---|---|
State | New |
Headers | show |
Series | SDCard: bugfixes, support UHS-I (part 5) | expand |
On Thu, Feb 15, 2018 at 2:13 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote: > Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Alistair Francis <alistair.francis@xilinx.com> Alistair > --- > hw/sd/sd.c | 29 ++++++++++++++++++++++++++--- > 1 file changed, 26 insertions(+), 3 deletions(-) > > diff --git a/hw/sd/sd.c b/hw/sd/sd.c > index 4f82638735..0ecb446fdb 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_spi_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_spi_cmd; > + } > switch (sd->state) { > case sd_transfer_state: > sd->sd_status[0] &= 0x3f; > @@ -1569,6 +1586,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd, > default: > /* Fall back to standard commands. */ > return sd_normal_command(sd, req); > + > + unimplemented_spi_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.16.1 > >
diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 4f82638735..0ecb446fdb 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_spi_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_spi_cmd; + } switch (sd->state) { case sd_transfer_state: sd->sd_status[0] &= 0x3f; @@ -1569,6 +1586,12 @@ static sd_rsp_type_t sd_app_command(SDState *sd, default: /* Fall back to standard commands. */ return sd_normal_command(sd, req); + + unimplemented_spi_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);
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> --- hw/sd/sd.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-)