From 2bb0703b30a6febfe6708e4ee1ce061bb19dd807 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Fri, 16 Sep 2016 14:39:48 -0700 Subject: cmd_writebcb_mx7: fix skip bad block when writing bootloader Correctly skip bad blocks when writing boot loader. Despite this fix U-Boot will generate excessive amount of messages when hitting a bad block: Size of write exceeds partition or device limit However, the command continues to write page by page until writing succeeds. Note that despite the correct bad block skip schema in place, the current FCB uses DISBBM = 1 which seems to disable the skip bad block handling in Boot ROM. Signed-off-by: Stefan Agner Acked-by: Marcel Ziswiler --- arch/arm/imx-common/cmd_writebcb_mx7.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/arch/arm/imx-common/cmd_writebcb_mx7.c b/arch/arm/imx-common/cmd_writebcb_mx7.c index 326ed6ec7d..4267cd7546 100644 --- a/arch/arm/imx-common/cmd_writebcb_mx7.c +++ b/arch/arm/imx-common/cmd_writebcb_mx7.c @@ -372,19 +372,27 @@ static void create_dbbt(nand_info_t *nand, uint8_t *buf) static void write_bootloader(nand_info_t *nand, uint8_t * addr, loff_t off, ulong fw_size) { - int i, j, ret; + int i, j, ret = 0; size_t maxsize; unsigned used_page_size, used_page_size_tmp; - ret = 0; used_page_size = 3 * nand->writesize / 4; maxsize = nand->writesize; - for (i = 0, j = 0; i < fw_size; - i += used_page_size, j += nand->writesize) { + for (i = 0, j = 0; i < fw_size; j += nand->writesize) { used_page_size_tmp = used_page_size; - ret |= nand_write_skip_bad(nand, off + j, &used_page_size_tmp, + ret = nand_write_skip_bad(nand, off + j, &used_page_size_tmp, NULL, maxsize, (u_char *)addr + i, WITH_WR_VERIFY); + + /* Increment only if data have been written */ + i += used_page_size_tmp; + + /* Ignore EFBIG, it means that we hit a bad block... */ + if (ret == -EFBIG) + ret = 0; + + if (ret) + break; } printf("Bootloader %d bytes written to 0x%x: %s\n", (int)fw_size, (int) off, ret ? "ERROR" : "OK"); -- cgit v1.2.3