* [Qemu-devel] [PATCH] Fix last sector write on sd card
@ 2011-07-25 12:21 Dr. David Alan Gilbert
2011-07-29 14:36 ` Anthony Liguori
0 siblings, 1 reply; 2+ messages in thread
From: Dr. David Alan Gilbert @ 2011-07-25 12:21 UTC (permalink / raw)
To: qemu-devel; +Cc: patches
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>
---
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;
/* Bzzzzzzztt .... Operation complete. */
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] Fix last sector write on sd card
2011-07-25 12:21 [Qemu-devel] [PATCH] Fix last sector write on sd card Dr. David Alan Gilbert
@ 2011-07-29 14:36 ` Anthony Liguori
0 siblings, 0 replies; 2+ messages in thread
From: Anthony Liguori @ 2011-07-29 14:36 UTC (permalink / raw)
To: Dr. David Alan Gilbert; +Cc: qemu-devel, patches
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 Gilbert<david.gilbert@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;
>
> /* Bzzzzzzztt .... Operation complete. */
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-07-29 14:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-25 12:21 [Qemu-devel] [PATCH] Fix last sector write on sd card Dr. David Alan Gilbert
2011-07-29 14:36 ` Anthony Liguori
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.