]> git.sur5r.net Git - openocd/commitdiff
at91samd: Bail early if trying to erase protected sector
authorAndrey Smirnov <andrew.smirnov@gmail.com>
Sat, 8 Feb 2014 19:58:22 +0000 (11:58 -0800)
committerPaul Fertser <fercerpav@gmail.com>
Sat, 29 Mar 2014 08:44:08 +0000 (08:44 +0000)
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>
src/flash/nor/at91samd.c

index c0be3f7d1cac21975abdb3eea9645eca28f56b29..ee9e9cbb9edcff95b9a95bb24220eea85efc9a46 100644 (file)
@@ -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;