diff options
author | Philippe Mathieu-Daudé <f4bug@amsat.org> | 2020-09-13 13:18:31 +0200 |
---|---|---|
committer | Philippe Mathieu-Daudé <f4bug@amsat.org> | 2020-10-21 13:19:02 +0200 |
commit | c8c8b3f1c179e1b8d21c2e636dc893ebfc522874 (patch) | |
tree | 1dd4818d4c050bc38587d339f293f399ef2e2a86 /hw | |
parent | 7dae0a1dd102ea5e58869a3082c61bfcadf29347 (diff) | |
download | qemu-c8c8b3f1c179e1b8d21c2e636dc893ebfc522874.zip |
hw/sd/sdcard: Reset both start/end addresses on error
From the Spec "4.3.5 Erase":
The host should adhere to the following command
sequence: ERASE_WR_BLK_START, ERASE_WR_BLK_END and
ERASE (CMD38).
If an erase (CMD38) or address setting (CMD32, 33)
command is received out of sequence, the card shall
set the ERASE_SEQ_ERROR bit in the status register
and reset the whole sequence.
Reset both addresses if the ERASE command occured
out of sequence (one of the start/end address is
not set).
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Tested-by: Alexander Bulekov <alxndr@bu.edu>
Message-Id: <20201015063824.212980-5-f4bug@amsat.org>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/sd/sd.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 4c05152f18..ee7b64023a 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -755,6 +755,8 @@ static void sd_erase(SDState *sd) if (sd->erase_start == INVALID_ADDRESS || sd->erase_end == INVALID_ADDRESS) { sd->card_status |= ERASE_SEQ_ERROR; + sd->erase_start = INVALID_ADDRESS; + sd->erase_end = INVALID_ADDRESS; return; } |