diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2014-02-08 11:58:22 -0800 |
---|---|---|
committer | Paul Fertser <fercerpav@gmail.com> | 2014-03-29 08:44:08 +0000 |
commit | c92a605e2622e5598c737a699d3164b9934bbd8c (patch) | |
tree | 5d3311cf09f031f4f84205c7cd4f80b4b22bbb36 | |
parent | 34db6b9c0aaf048fe5ef81cccf2c645b9b4ac456 (diff) |
at91samd: Bail early if trying to erase protected sector
Bail early if trying to erase protected sector and also do not double-erase already
erased sectors.
Change-Id: Ic2d39af48c3b8e10e78d52dd978b9bc01f671c6a
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Reviewed-on: http://openocd.zylin.com/2026
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
-rw-r--r-- | src/flash/nor/at91samd.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/flash/nor/at91samd.c b/src/flash/nor/at91samd.c index c0be3f7d..ee9e9cbb 100644 --- a/src/flash/nor/at91samd.c +++ b/src/flash/nor/at91samd.c @@ -360,16 +360,23 @@ static int samd_erase(struct flash_bank *bank, int first, int last) /* For each sector to be erased */ for (int s = first; s <= last; s++) { - /* For each row in that sector */ - for (int r = s * rows_in_sector; r < (s + 1) * rows_in_sector; r++) { - res = samd_erase_row(bank, r * chip->page_size * 4); - if (res != ERROR_OK) { - LOG_ERROR("SAMD: failed to erase sector %d", s); - return res; - } + if (bank->sectors[s].is_protected) { + LOG_ERROR("SAMD: failed to erase sector %d. That sector is write-protected", s); + return ERROR_FLASH_OPERATION_FAILED; } - bank->sectors[s].is_erased = 1; + if (!bank->sectors[s].is_erased) { + /* For each row in that sector */ + for (int r = s * rows_in_sector; r < (s + 1) * rows_in_sector; r++) { + res = samd_erase_row(bank, r * chip->page_size * 4); + if (res != ERROR_OK) { + LOG_ERROR("SAMD: failed to erase sector %d", s); + return res; + } + } + + bank->sectors[s].is_erased = 1; + } } return ERROR_OK; |