[PATCH] Fix fastboot handling of partitions when no slots are supported

The fastboot module has a bug that prevents some command to work properly on devices that haven't an Android-like partition scheme, that is, just one spl and one kernel partition, instead of the redundant scheme with _a and _b slots.
This is the schema of our NAND storage (board is based on an AllWinner A33 sunxi chip):
=> mtdparts
device nand0 <1c03000.nand>, # parts = 4 #: name size net size offset mask_flags 0: spl 0x00020000 0x00020000 0x00000000 0 1: uboot 0x00100000 0x00100000 0x00020000 0 2: kernel_a 0x00400000 0x00400000 0x00120000 0 3: ubi 0x07ae0000 0x079e0000 (!) 0x00520000 0
active partition: nand0,0 - (spl) 0x00020000 @ 0x00000000
This happens when we try to erase the spl partition using fastboot:
$ fastboot erase spl Erasing 'spl_a' FAILED (remote: 'invalid NAND device') fastboot: error: Command failed
The error occurs because getvars fails to handle the error returned by nand layer when a partition cannot be found.
Indeed, getvar_get_part_info returns what is returned by fastboot_nand_get_part_info (0 on success, 1 on failure) but it should return -ENODEV or -EINVAL instead. Since the cause of failure is not returned by the nand function, I decided to return -EINVAL to make it simple.
Signed-off-by: Federico Fuga fuga@studiofuga.com --- drivers/fastboot/fb_getvar.c | 5 ++++- drivers/fastboot/fb_nand.c | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/fastboot/fb_getvar.c b/drivers/fastboot/fb_getvar.c index 9c2ce65a4e..816ed8a621 100644 --- a/drivers/fastboot/fb_getvar.c +++ b/drivers/fastboot/fb_getvar.c @@ -121,8 +121,11 @@ static int getvar_get_part_info(const char *part_name, char *response, *size = disk_part.size * disk_part.blksz; } else if (IS_ENABLED(CONFIG_FASTBOOT_FLASH_NAND)) { r = fastboot_nand_get_part_info(part_name, &part_info, response); - if (r >= 0 && size) + if (r == 0 && size) { *size = part_info->size; + } else { + r = -EINVAL; + } } else { fastboot_fail("this storage is not supported in bootloader", response); r = -ENODEV; diff --git a/drivers/fastboot/fb_nand.c b/drivers/fastboot/fb_nand.c index afc64fd528..9e2f7c0189 100644 --- a/drivers/fastboot/fb_nand.c +++ b/drivers/fastboot/fb_nand.c @@ -151,7 +151,7 @@ static lbaint_t fb_nand_sparse_reserve(struct sparse_storage *info, * * @part_name: Named device to lookup * @part_info: Pointer to returned part_info pointer - * @response: Pointer to fastboot response buffer + * @response: 0 on success, 1 otherwise */ int fastboot_nand_get_part_info(const char *part_name, struct part_info **part_info, char *response)
participants (1)
-
Federico Fuga