We need to address the redundat image case and undestand if the
image is corrupted or not and fallback to the copy. The function
used before was always return 0 without any evaluation of the
error. We try to make it work properly

Change-Id: Id6fc221c5cc08934b7324dd5d319b93c56e2e678
Signed-off-by: Michael Trimarchi <mich...@amarulasolutions.com>
---
 common/spl/spl_nand.c | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index 9a52500..b96fce2 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -44,9 +44,7 @@ static int spl_nand_load_element(struct spl_image_info 
*spl_image,
 {
        int err;
 
-       err = nand_spl_load_image(offset, sizeof(*header), (void *)header);
-       if (err)
-               return err;
+       nand_spl_load_image(offset, sizeof(*header), (void *)header);
 
        if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
            image_get_magic(header) == FDT_MAGIC) {
@@ -59,13 +57,31 @@ static int spl_nand_load_element(struct spl_image_info 
*spl_image,
                load.bl_len = 1;
                load.read = spl_nand_fit_read;
                return spl_load_simple_fit(spl_image, &load, offset, header);
-       } else {
-               err = spl_parse_image_header(spl_image, header);
-               if (err)
-                       return err;
-               return nand_spl_load_image(offset, spl_image->size,
-                                          (void *)(ulong)spl_image->load_addr);
        }
+       err = spl_parse_image_header(spl_image, header);
+       if (err)
+               return err;
+
+       nand_spl_load_image(offset, spl_image->size,
+                          (void *)(ulong)spl_image->load_addr);
+
+       /*
+        * Logic of the error is inverted for image_check* functions.
+        * We want to verify that header is correct and the data are correct
+        * for LEGACY image type
+        */
+       err = image_check_hcrc((const image_header_t *)spl_image->load_addr);
+       if (!err) {
+               debug("Header checksum failed\n");
+               return -EINVAL;
+       }
+       err = image_check_dcrc((const image_header_t *)spl_image->load_addr);
+       if (!err) {
+               debug("Image checksum failed\n");
+               return -EINVAL;
+       }
+
+       return 0;
 }
 
 static int spl_nand_load_image(struct spl_image_info *spl_image,
-- 
2.7.4

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

Reply via email to