Hi Mattijs,

thanks for your kind response and suggestions.

We are actually suspending the development on this board, because it seems the support for our hardware (sunxi A33) requires too much work than expected. We were trying to update our 2018-flavoured bootloader but it seems we did a lot of steps back, for reason I can't fully grasp.

Anyway, I'll try to work on this patch in my spare time.


Specifically:



On 30/01/25 14:49, Mattijs Korpershoek wrote:
Hi Federico,

Thank you for the patch.

On mar., janv. 28, 2025 at 12:18, Federico Fuga via B4 Relay 
<[email protected]> wrote:

From: Federico Fuga <[email protected]>

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 <[email protected]>
I could apply this version, finally :)

b4 got a bit confused since it has been send as a v1 but using the
following command worked for me:

$ b4 shazam -s -l --check 
[email protected] -v1


Yes I did notice this, I tried it after sending and I was puzzled why it spit out the same error as before. I'm still learning.


Now for the patch itself:

Please use 'fastboot:' prefix as a commit title.
Use '$ git log --oneline -- drivers/fastboot/' to see what other commits
where using as a title.

Some more comments below. Please make sure to answer this email to
acknowledge/reject review feedback.
Also, when sending a v2, please make sure to include a changelog.

If you need help setting things up properly, let me know. I'm also
reachable on IRC https://libera.chat/, channel #u-boot, my nickame is 
mkorpershoek.


Thanks, I'll surely do.


---
  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 
9c2ce65a4e5bce0da6b18aa1b2818f7db556c528..816ed8a6213b5c1f0948a813c6f6a865a4b47ba8
 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;
Maybe the patch is simpler this way, but I think that it would be better
if fastboot_mmc_get_part_info() and fastboot_nand_get_part_info() would
behave the same. The naming is pretty close already, and having
different behaviours/return codes seems confusing to me.


Indeed, having the same code would be definitely proper.


Is there a strong reason for not modifying fb_nand_lookup() so that it
will return a negative error code?


The reason was I didn't think about it. I misread the code and thought the error code were different.



This way, we can keep the same logic in getvar_get_part_info()
+               } 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 
afc64fd5280717ae4041ed70268ccc01cfbb0496..9e2f7c01895785a4409eb67ea48abd02a6a6da26
 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
Why has this been modified? @response is still a pointer to fastboot
response buffer.


Yes, reason is same as above. I simply misread the code.


Thanks


Federico


If we wish to document the return code, use the Return: syntax:

For example, here it would be:

/**
  * fastboot_nand_get_part_info() - Lookup NAND partion by name
  *
  * @part_name: Named device to lookup
  * @part_info: Pointer to returned part_info pointer
  * @response: Pointer to fastboot response buffer
  *
  * Return: 0 on success, 1 otherwise
  */

   */
  int fastboot_nand_get_part_info(const char *part_name,
                                struct part_info **part_info, char *response)

---
base-commit: a517796cfa5d8f4ca2f0c11c78c24a08a102c047
change-id: 20250128-fastboot_slot_fix-69251576d9bb

Best regards,
--
Federico Fuga <[email protected]>

Reply via email to