hw/sd: sd: Remove duplicated codes in single/multiple block read/write
The single block read (CMD17) codes are the same as the multiple block read (CMD18). Merge them into one. The same applies to single block write (CMD24) and multiple block write (CMD25). Signed-off-by: Bin Meng <bin.meng@windriver.com> Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Acked-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20210128063035.15674-3-bmeng.cn@gmail.com> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
parent
1365d863a7
commit
cdf6701bcc
47
hw/sd/sd.c
47
hw/sd/sd.c
@ -1181,24 +1181,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 17: /* CMD17: READ_SINGLE_BLOCK */
|
case 17: /* CMD17: READ_SINGLE_BLOCK */
|
||||||
switch (sd->state) {
|
|
||||||
case sd_transfer_state:
|
|
||||||
|
|
||||||
if (addr + sd->blk_len > sd->size) {
|
|
||||||
sd->card_status |= ADDRESS_ERROR;
|
|
||||||
return sd_r1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sd->state = sd_sendingdata_state;
|
|
||||||
sd->data_start = addr;
|
|
||||||
sd->data_offset = 0;
|
|
||||||
return sd_r1;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 18: /* CMD18: READ_MULTIPLE_BLOCK */
|
case 18: /* CMD18: READ_MULTIPLE_BLOCK */
|
||||||
switch (sd->state) {
|
switch (sd->state) {
|
||||||
case sd_transfer_state:
|
case sd_transfer_state:
|
||||||
@ -1245,35 +1227,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
|
|||||||
|
|
||||||
/* Block write commands (Class 4) */
|
/* Block write commands (Class 4) */
|
||||||
case 24: /* CMD24: WRITE_SINGLE_BLOCK */
|
case 24: /* CMD24: WRITE_SINGLE_BLOCK */
|
||||||
switch (sd->state) {
|
|
||||||
case sd_transfer_state:
|
|
||||||
/* Writing in SPI mode not implemented. */
|
|
||||||
if (sd->spi)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (addr + sd->blk_len > sd->size) {
|
|
||||||
sd->card_status |= ADDRESS_ERROR;
|
|
||||||
return sd_r1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sd->state = sd_receivingdata_state;
|
|
||||||
sd->data_start = addr;
|
|
||||||
sd->data_offset = 0;
|
|
||||||
sd->blk_written = 0;
|
|
||||||
|
|
||||||
if (sd_wp_addr(sd, sd->data_start)) {
|
|
||||||
sd->card_status |= WP_VIOLATION;
|
|
||||||
}
|
|
||||||
if (sd->csd[14] & 0x30) {
|
|
||||||
sd->card_status |= WP_VIOLATION;
|
|
||||||
}
|
|
||||||
return sd_r1;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
|
case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
|
||||||
switch (sd->state) {
|
switch (sd->state) {
|
||||||
case sd_transfer_state:
|
case sd_transfer_state:
|
||||||
|
Loading…
Reference in New Issue
Block a user