On 6/28/24 9:01 AM, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
> hw/sd/sd.c | 29 +++++++++++++++++------------
> 1 file changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index e4941cfdab..61c9aff2fb 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] = {
> - [6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
> + [7] = "SELECT/DESELECT_CARD",
> [8] = "SEND_IF_COND", [9] = "SEND_CSD",
> [10] = "SEND_CID",
> [12] = "STOP_TRANSMISSION", [13] = "SEND_STATUS",
> @@ -1244,6 +1244,20 @@ static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req)
> }
> }
>
> +/* CMD6 */
> +static sd_rsp_type_t sd_cmd_SWITCH_FUNCTION(SDState *sd, SDRequest req)
> +{
> + if (sd->mode != sd_data_transfer_mode) {
> + return sd_invalid_mode_for_cmd(sd, req);
> + }
> + if (sd->state != sd_transfer_state) {
> + return sd_invalid_state_for_cmd(sd, req);
> + }
> +
> + sd_function_switch(sd, req.arg);
> + return sd_cmd_to_sendingdata(sd, req, 0, NULL, 64);
> +}
> +
> /* CMD19 */
> static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req)
> {
> @@ -1310,17 +1324,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
>
> switch (req.cmd) {
> /* Basic commands (Class 0 and Class 1) */
> - case 6: /* CMD6: SWITCH_FUNCTION */
> - if (sd->mode != sd_data_transfer_mode) {
> - return sd_invalid_mode_for_cmd(sd, req);
> - }
> - if (sd->state != sd_transfer_state) {
> - return sd_invalid_state_for_cmd(sd, req);
> - }
> -
> - sd_function_switch(sd, req.arg);
> - return sd_cmd_to_sendingdata(sd, req, 0, NULL, 64);
> -
> case 7: /* CMD7: SELECT/DESELECT_CARD */
> rca = sd_req_get_rca(sd, req);
> switch (sd->state) {
> @@ -2266,6 +2269,7 @@ static const SDProto sd_proto_spi = {
> [0] = {0, sd_spi, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
> [1] = {0, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
> [5] = {9, sd_spi, "IO_SEND_OP_COND", sd_cmd_optional},
> + [6] = {10, sd_spi, "SWITCH_FUNCTION", sd_cmd_SWITCH_FUNCTION},
> [34] = {10, sd_spi, "READ_SEC_CMD", sd_cmd_optional},
> [35] = {10, sd_spi, "WRITE_SEC_CMD", sd_cmd_optional},
> [36] = {10, sd_spi, "SEND_PSI", sd_cmd_optional},
> @@ -2288,6 +2292,7 @@ static const SDProto sd_proto_sd = {
> [3] = {0, sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
> [4] = {0, sd_bc, "SEND_DSR", sd_cmd_unimplemented},
> [5] = {9, sd_bc, "IO_SEND_OP_COND", sd_cmd_optional},
> + [6] = {10, sd_adtc, "SWITCH_FUNCTION", sd_cmd_SWITCH_FUNCTION},
> [11] = {0, sd_ac, "VOLTAGE_SWITCH", sd_cmd_optional},
> [19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
> [20] = {2, sd_ac, "SPEED_CLASS_CONTROL", sd_cmd_optional},