mirror of https://github.com/xemu-project/xemu.git
Fix last sector write on sd card
When writing the last sector of an SD card using WRITE_MULTIPLE_BLOCK QEmu throws an error saying that we've run off the end, and leaves itself in the wrong state. Tested on ARM Vexpress model. Signed-off-by: Dr. David Alan Gilbert <david.gilbert@linaro.org> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
cbbab9226d
commit
33fa8234c3
19
hw/sd.c
19
hw/sd.c
|
@ -1450,14 +1450,8 @@ void sd_write_data(SDState *sd, uint8_t value)
|
|||
break;
|
||||
|
||||
case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
|
||||
sd->data[sd->data_offset ++] = value;
|
||||
if (sd->data_offset >= sd->blk_len) {
|
||||
/* TODO: Check CRC before committing */
|
||||
sd->state = sd_programming_state;
|
||||
BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
|
||||
sd->blk_written ++;
|
||||
sd->data_start += sd->blk_len;
|
||||
sd->data_offset = 0;
|
||||
if (sd->data_offset == 0) {
|
||||
/* Start of the block - lets check the address is valid */
|
||||
if (sd->data_start + sd->blk_len > sd->size) {
|
||||
sd->card_status |= ADDRESS_ERROR;
|
||||
break;
|
||||
|
@ -1466,6 +1460,15 @@ void sd_write_data(SDState *sd, uint8_t value)
|
|||
sd->card_status |= WP_VIOLATION;
|
||||
break;
|
||||
}
|
||||
}
|
||||
sd->data[sd->data_offset++] = value;
|
||||
if (sd->data_offset >= sd->blk_len) {
|
||||
/* TODO: Check CRC before committing */
|
||||
sd->state = sd_programming_state;
|
||||
BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
|
||||
sd->blk_written++;
|
||||
sd->data_start += sd->blk_len;
|
||||
sd->data_offset = 0;
|
||||
sd->csd[14] |= 0x40;
|
||||
|
||||
/* Bzzzzzzztt .... Operation complete. */
|
||||
|
|
Loading…
Reference in New Issue