]> git.sur5r.net Git - openocd/commitdiff
flash/nor/stm32: Report errors in wait_status_busy
authorChristopher Head <chead@zaber.com>
Mon, 14 May 2018 18:56:56 +0000 (11:56 -0700)
committerTomas Vanek <vanekt@fbl.cz>
Tue, 3 Jul 2018 06:47:14 +0000 (07:47 +0100)
Flash operation errors that occur during algorithm programming are
reported via the algorithm return value. However, Flash operation
errors that occur during non-algorithm work (erasing, programming
without a work area, programming the last non-multiple-of-32-bytes on
an H7, etc.) generally end with a call to stm32x_wait_status_busy,
which reads the status register and clears the error flags but fails
to actually report that something went wrong should an error flag
(other than WRPERR) be set. Return an error status from
stm32x_wait_status_busy in those cases. Correct a log message
accordingly.

Change-Id: I09369ea5f924fe58833aec1f45e52320ab4aaf43
Signed-off-by: Christopher Head <chead@zaber.com>
Reviewed-on: http://openocd.zylin.com/4519
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
src/flash/nor/stm32f2x.c
src/flash/nor/stm32h7x.c
src/flash/nor/stm32l4x.c

index 8013e58698339e95f70a5d5199c90348b064b9f6..43f5d12d9ec23c3e081211871fe770bb293140c6 100644 (file)
@@ -252,6 +252,8 @@ static int stm32x_wait_status_busy(struct flash_bank *bank, int timeout)
 
        /* Clear but report errors */
        if (status & FLASH_ERROR) {
+               if (retval == ERROR_OK)
+                       retval = ERROR_FAIL;
                /* If this operation fails, we ignore it and report the original
                 * retval
                 */
index 009eb9b86e9c457ebba325de61c977b339522de7..8f34e0475158a9da5df5dfbd147a09817d750641 100644 (file)
@@ -220,6 +220,8 @@ static int stm32x_wait_status_busy(struct flash_bank *bank, int timeout)
 
        /* Clear error + EOP flags but report errors */
        if (status & FLASH_ERROR) {
+               if (retval == ERROR_OK)
+                       retval = ERROR_FAIL;
                /* If this operation fails, we ignore it and report the original retval */
                target_write_u32(target, stm32x_get_flash_reg(bank, FLASH_CCR), status);
        }
@@ -495,7 +497,7 @@ static int stm32x_erase(struct flash_bank *bank, int first, int last)
                retval = stm32x_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
 
                if (retval != ERROR_OK) {
-                       LOG_ERROR("erase time-out error sector %d", i);
+                       LOG_ERROR("erase time-out or operation error sector %d", i);
                        return retval;
                }
                bank->sectors[i].is_erased = 1;
index e47313c199262839077e69bf19970393d738e942..f71369330eb451d6b5a5788d831e88a7e06c6e0a 100644 (file)
@@ -187,6 +187,8 @@ static int stm32l4_wait_status_busy(struct flash_bank *bank, int timeout)
 
        /* Clear but report errors */
        if (status & FLASH_ERROR) {
+               if (retval == ERROR_OK)
+                       retval = ERROR_FAIL;
                /* If this operation fails, we ignore it and report the original
                 * retval
                 */