On 6/28/24 9:01 AM, Philippe Mathieu-Daudé wrote:
> The CSD::CSR_IMP bit defines whether the Driver Stage
> Register (DSR) is implemented or not. We do not set
> this bit in CSD:
>
> static void sd_set_csd(SDState *sd, uint64_t size)
> {
> ...
> if (size <= SDSC_MAX_CAPACITY) { /* Standard Capacity SD */
> ...
> sd->csd[6] = 0xe0 | /* Partial block for read allowed */
> ((csize >> 10) & 0x03);
> ...
> } else { /* SDHC */
> ...
> sd->csd[6] = 0x00;
> ...
> }
> ...
> }
>
> The sd_normal_command() switch case for the SEND_DSR
> command do nothing and fallback to "illegal command".
> Since the command is mandatory (although the register
> isn't...) call the sd_cmd_unimplemented() handler.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
> hw/sd/sd.c | 14 ++------------
> 1 file changed, 2 insertions(+), 12 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index a816493d37..097cb0f2e2 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -240,7 +240,7 @@ static const char *sd_response_name(sd_rsp_type_t rsp)
> static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
> {
> static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
> - [4] = "SET_DSR", [5] = "IO_SEND_OP_COND",
> + [5] = "IO_SEND_OP_COND",
> [6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
> [8] = "SEND_IF_COND", [9] = "SEND_CSD",
> [10] = "SEND_CID", [11] = "VOLTAGE_SWITCH",
> @@ -1153,7 +1153,6 @@ static sd_rsp_type_t sd_cmd_illegal(SDState *sd, SDRequest req)
> }
>
> /* Commands that are recognised but not yet implemented. */
> -__attribute__((unused))
> static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req)
> {
> qemu_log_mask(LOG_UNIMP, "%s: CMD%i not implemented\n",
> @@ -1312,16 +1311,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>
> switch (req.cmd) {
> /* Basic commands (Class 0 and Class 1) */
> - case 4: /* CMD4: SEND_DSR */
> - switch (sd->state) {
> - case sd_standby_state:
> - break;
> -
> - default:
> - break;
> - }
> - break;
> -
> case 6: /* CMD6: SWITCH_FUNCTION */
> if (sd->mode != sd_data_transfer_mode) {
> return sd_invalid_mode_for_cmd(sd, req);
> @@ -2289,6 +2278,7 @@ static const SDProto sd_proto_sd = {
> [0] = {0, sd_bc, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
> [2] = {0, sd_bcr, "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
> [3] = {0, sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
> + [4] = {0, sd_bc, "SEND_DSR", sd_cmd_unimplemented},
> [19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
> [23] = {2, sd_ac, "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
> },