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

Federico Fuga fuga at studiofuga.com
Mon Jan 27 10:39:33 CET 2025


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       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 at 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 93cbd598e0..f5d8b03301 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 5a55144479..3ee0f40ea8 100644
--- a/drivers/fastboot/fb_nand.c
+++ b/drivers/fastboot/fb_nand.c
@@ -141,7 +141,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)
-- 
2.48.1

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_0xEBBD37A93653C032.asc
Type: application/pgp-keys
Size: 2449 bytes
Desc: OpenPGP public key
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20250127/679ff923/attachment.key>


More information about the U-Boot mailing list