aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2014-02-08 11:58:22 -0800
committerPaul Fertser <fercerpav@gmail.com>2014-03-29 08:44:08 +0000
commitc92a605e2622e5598c737a699d3164b9934bbd8c (patch)
tree5d3311cf09f031f4f84205c7cd4f80b4b22bbb36
parent34db6b9c0aaf048fe5ef81cccf2c645b9b4ac456 (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.c23
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;