qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] Fix last sector write on sd card


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] Fix last sector write on sd card
Date: Fri, 29 Jul 2011 09:36:36 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110516 Lightning/1.0b2 Thunderbird/3.1.10

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<address@hidden>

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.  */






reply via email to

[Prev in Thread] Current Thread [Next in Thread]