diff mbox

[v2,2/4] sdcard: Correct CRC16 offset in sd_function_switch()

Message ID 20180509060104.4458-3-f4bug@amsat.org (mailing list archive)
State New, archived
Headers show

Commit Message

Philippe Mathieu-Daudé May 9, 2018, 6:01 a.m. UTC
Per the Physical Layer Simplified Spec. "4.3.10.4 Switch Function Status":

  The block length is predefined to 512 bits

and "4.10.2 SD Status":

  The SD Status contains status bits that are related to the SD Memory Card
  proprietary features and may be used for future application-specific usage.
  The size of the SD Status is one data block of 512 bit. The content of this
  register is transmitted to the Host over the DAT bus along with a 16-bit CRC.

Thus the 16-bit CRC goes at offset 64.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/sd/sd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Peter Maydell May 14, 2018, 3:50 p.m. UTC | #1
On 9 May 2018 at 07:01, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Per the Physical Layer Simplified Spec. "4.3.10.4 Switch Function Status":
>
>   The block length is predefined to 512 bits
>
> and "4.10.2 SD Status":
>
>   The SD Status contains status bits that are related to the SD Memory Card
>   proprietary features and may be used for future application-specific usage.
>   The size of the SD Status is one data block of 512 bit. The content of this
>   register is transmitted to the Host over the DAT bus along with a 16-bit CRC.
>
> Thus the 16-bit CRC goes at offset 64.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/sd/sd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 5fb4787671..24aaf0c767 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -791,7 +791,7 @@ static void sd_function_switch(SDState *sd, uint32_t arg)
>          sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
>      }
>      memset(&sd->data[17], 0, 47);
> -    stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
> +    stw_be_p(sd->data + 64, sd_crc16(sd->data, 64));
>  }
>
>  static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
> --

Oops, yes, off-by-one error that's been present forever (it was
there before we did the conversion to stw_be_p()).

Applied this one to target-arm.next.

thanks
-- PMM
diff mbox

Patch

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 5fb4787671..24aaf0c767 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -791,7 +791,7 @@  static void sd_function_switch(SDState *sd, uint32_t arg)
         sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
     }
     memset(&sd->data[17], 0, 47);
-    stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
+    stw_be_p(sd->data + 64, sd_crc16(sd->data, 64));
 }
 
 static inline bool sd_wp_addr(SDState *sd, uint64_t addr)