On 9/3/19 1:52 AM, Anton Leontiev wrote:
From: Anton Leontiev <aleont...@elvees.com>

As FDTDIR label doesn't specify exact file to be loaded, it should
not fail if no file exists in the directory. In this case try to boot
with internal FDT if it exists.

Signed-off-by: Anton Leontiev <aleont...@elvees.com>
---
  cmd/pxe.c | 21 ++++++++++++++-------
  1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/cmd/pxe.c b/cmd/pxe.c
index 2059975446..1eec6d29bf 100644
--- a/cmd/pxe.c
+++ b/cmd/pxe.c
@@ -727,11 +727,14 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label 
*label)
/*
         * fdt usage is optional:
-        * It handles the following scenarios. All scenarios are exclusive
+        * It handles the following scenarios.
         *
-        * Scenario 1: If fdt_addr_r specified and "fdt" label is defined in
-        * pxe file, retrieve fdt blob from server. Pass fdt_addr_r to bootm,
-        * and adjust argc appropriately.
+        * Scenario 1: If fdt_addr_r specified and "fdt" or "fdtdir" label is
+        * defined in pxe file, retrieve fdt blob from server. Pass fdt_addr_r 
to
+        * bootm, and adjust argc appropriately.
+        *
+        * If retrieve fails and no exact fdt blob is specified in pxe file with
+        * "fdt" label, try Scenario 2.

Is it possible/sensible to distinguish between "file not found" and "error during retrieval"? "File not found" indicates the case you care about, and continuing to use a built-in DT makes sense here. "Error during retrieval" indicates that the file was found, and hence really should be use, yet couldn't be due to download failure. In this case, I wonder if we shouldn't outright fail this boot option, just like the existing code does?

But either way, I suppose this patch is reasonable.

         * Scenario 2: If there is an fdt_addr specified, pass it along to
         * bootm, and adjust argc appropriately.
@@ -795,9 +798,13 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label 
*label)
                        int err = get_relfile_envaddr(cmdtp, fdtfile, 
"fdt_addr_r");
                        free(fdtfilefree);
                        if (err < 0) {
-                               printf("Skipping %s for failure retrieving 
fdt\n",
-                                               label->name);
-                               goto cleanup;
+                               bootm_argv[3] = NULL;
+
+                               if (label->fdt) {
+                                       printf("Skipping %s for failure retrieving 
FDT\n",
+                                              label->name);
+                                       goto cleanup;
+                               }
                        }
                } else {
                        bootm_argv[3] = NULL;


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to