diff options
author | Stefan Riedmueller <s.riedmueller@phytec.de> | 2021-03-30 08:50:40 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2021-04-01 10:24:14 +0200 |
commit | 0a08cd09b36cacb58788dbc82b463126bc737a45 (patch) | |
tree | f993635f6e7e84ae571aca0f6e58305729c058de | |
parent | 0e18518c1548f22602a9a9e1a2a3d2ee1cb47724 (diff) | |
download | barebox-0a08cd09b36cacb58788dbc82b463126bc737a45.tar.gz barebox-0a08cd09b36cacb58788dbc82b463126bc737a45.tar.xz |
imx-bbu-nand-fcb: Inform user if the barebox partition is too small
Show an error message and return an error code if the barebox partition
is too small. This can easily happen when having large erasoblocks since
all four FCB copies need a separate eraseblock.
Signed-off-by: Stefan Riedmueller <s.riedmueller@phytec.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | common/imx-bbu-nand-fcb.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/common/imx-bbu-nand-fcb.c b/common/imx-bbu-nand-fcb.c index 0e008c6bc2..4e680a0a51 100644 --- a/common/imx-bbu-nand-fcb.c +++ b/common/imx-bbu-nand-fcb.c @@ -501,7 +501,8 @@ static int imx_bbu_firmware_start_block(struct mtd_info *mtd, int num) * @num: The slot number (0 or 1) * * This returns the start page for a firmware slot, to be written into the - * Firmwaren_startingPage field in the FCB. + * Firmwaren_startingPage field in the FCB or a negative error code in case + * of a failure. */ static int imx_bbu_firmware_fcb_start_page(struct mtd_info *mtd, int num) { @@ -512,6 +513,11 @@ static int imx_bbu_firmware_fcb_start_page(struct mtd_info *mtd, int num) blocksleft = imx_bbu_firmware_max_blocks(mtd); + if (blocksleft <= 0) { + pr_err("partition size too small for both firmwares\n"); + return -ENOMEM; + } + /* * The ROM only checks for a bad block when advancing the read position, * but not if the initial block is good, hence we cannot directly point @@ -1258,7 +1264,15 @@ static int imx_bbu_nand_update(struct bbu_handler *handler, struct bbu_data *dat free(fcb); fcb = xzalloc(sizeof(*fcb)); fcb->Firmware1_startingPage = imx_bbu_firmware_fcb_start_page(mtd, !used); + if (fcb->Firmware1_startingPage < 0) { + ret = fcb->Firmware1_startingPage; + goto out; + } fcb->Firmware2_startingPage = imx_bbu_firmware_fcb_start_page(mtd, used); + if (fcb->Firmware2_startingPage < 0) { + ret = fcb->Firmware2_startingPage; + goto out; + } fcb->PagesInFirmware1 = fw_size / mtd->writesize; fcb->PagesInFirmware2 = fcb->PagesInFirmware1; |