On 27 July 2012 20:29, Igor Mitsyanko <i.mitsya...@samsung.com> wrote: > Standard capacity cards SDSC use byte unit address while SDHC and SDXC Cards > use > block unit address (512 bytes) when setting ERASE_START and ERASE_END with > CMD32 > and CMD33, we have to account for this. > > Signed-off-by: Igor Mitsyanko <i.mitsya...@samsung.com> > --- > hw/sd.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/hw/sd.c b/hw/sd.c > index d0674d5..f7aa580 100644 > --- a/hw/sd.c > +++ b/hw/sd.c > @@ -482,8 +482,10 @@ static void sd_erase(SDState *sd) > return; > } > > - start = sd_addr_to_wpnum(sd->erase_start); > - end = sd_addr_to_wpnum(sd->erase_end); > + start = sd_addr_to_wpnum(sd->ocr & (1 << 30) ? > + (uint64_t)sd->erase_start * 512 : sd->erase_start); > + end = sd_addr_to_wpnum(sd->ocr & (1 << 30) ? > + (uint64_t)sd->erase_end * 512 : sd->erase_end);
I think this would be a little clearer phrased as: uint64_t erase_start = sd->erase_start; uint64_t erase_end = sd->erase_end; [...] if (extract32(sd->ocr, 30, 1)) { /* High capacity memory card: erase units are 512 byte blocks */ erase_start *= 512; erase_end *= 512; } start = sd_addr_to_wpnum(erase_start); end = sd_addr_to_wpnum(erase_end); (I don't insist on the extract32() if you don't like it, but I would like to avoid the repeated inline ?: ops.) -- PMM