Skip to content

Commit

Permalink
hw/sd: sd: Skip write protect groups check in sd_erase() for high cap…
Browse files Browse the repository at this point in the history
…acity cards

High capacity cards don't support write protection hence we should
not perform the write protect groups check in sd_erase() for them.

Signed-off-by: Bin Meng <bin.meng@windriver.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20210216150225.27996-6-bmeng.cn@gmail.com>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
  • Loading branch information
lbmeng authored and philmd committed Feb 19, 2021
1 parent ce6ea2e commit 2473dc4
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions hw/sd/sd.c
Expand Up @@ -765,6 +765,7 @@ static void sd_erase(SDState *sd)
int i;
uint64_t erase_start = sd->erase_start;
uint64_t erase_end = sd->erase_end;
bool sdsc = true;

trace_sdcard_erase(sd->erase_start, sd->erase_end);
if (sd->erase_start == INVALID_ADDRESS
Expand All @@ -779,6 +780,7 @@ static void sd_erase(SDState *sd)
/* High capacity memory card: erase units are 512 byte blocks */
erase_start *= 512;
erase_end *= 512;
sdsc = false;
}

if (erase_start > sd->size || erase_end > sd->size) {
Expand All @@ -788,16 +790,20 @@ static void sd_erase(SDState *sd)
return;
}

erase_start = sd_addr_to_wpnum(erase_start);
erase_end = sd_addr_to_wpnum(erase_end);
sd->erase_start = INVALID_ADDRESS;
sd->erase_end = INVALID_ADDRESS;
sd->csd[14] |= 0x40;

for (i = erase_start; i <= erase_end; i++) {
assert(i < sd->wpgrps_size);
if (test_bit(i, sd->wp_groups)) {
sd->card_status |= WP_ERASE_SKIP;
/* Only SDSC cards support write protect groups */
if (sdsc) {
erase_start = sd_addr_to_wpnum(erase_start);
erase_end = sd_addr_to_wpnum(erase_end);

for (i = erase_start; i <= erase_end; i++) {
assert(i < sd->wpgrps_size);
if (test_bit(i, sd->wp_groups)) {
sd->card_status |= WP_ERASE_SKIP;
}
}
}
}
Expand Down

0 comments on commit 2473dc4

Please sign in to comment.