Re: [Qemu-devel] [PATCH] Fix last sector write on sd card
On 07/25/2011 07:21 AM, Dr. David Alan Gilbert wrote: 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 Gilbertdavid.gilb...@linaro.org Applied. Thanks. Regards, Anthony Liguori --- Don't throw address error on last block, and leave in correct state. diff --git a/hw/sd.c b/hw/sd.c index cedfb20..219a0dd 100644 --- a/hw/sd.c +++ b/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; /* Bzzztt Operation complete. */
[Qemu-devel] [PATCH] 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.gilb...@linaro.org --- Don't throw address error on last block, and leave in correct state. diff --git a/hw/sd.c b/hw/sd.c index cedfb20..219a0dd 100644 --- a/hw/sd.c +++ b/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; /* Bzzztt Operation complete. */