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

2011-07-29 Thread Anthony Liguori

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

2011-07-25 Thread Dr. David Alan Gilbert
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.  */