From 6d8dbe4862f0b343427fc4f2bd15aefab73706bf Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Tue, 12 Mar 2019 04:02:39 +0100 Subject: spl: ymodem: Terminate YModem session on error In case spl_parse_image_header() errors out, terminate the YModem session, otherwise we won't get any further output. Signed-off-by: Marek Vasut Cc: Tom Rini --- common/spl/spl_ymodem.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'common') diff --git a/common/spl/spl_ymodem.c b/common/spl/spl_ymodem.c index 577fdc69afe..8058fd6a7c7 100644 --- a/common/spl/spl_ymodem.c +++ b/common/spl/spl_ymodem.c @@ -111,7 +111,7 @@ static int spl_ymodem_load_image(struct spl_image_info *spl_image, ih = (struct image_header *)buf; ret = spl_parse_image_header(spl_image, ih); if (ret) - return ret; + goto end_stream; #ifdef CONFIG_SPL_GZIP if (ih->ih_comp == IH_COMP_GZIP) addr = CONFIG_SYS_LOAD_ADDR; @@ -147,6 +147,7 @@ end_stream: xyzModem_stream_terminate(false, &getcymodem); printf("Loaded %lu bytes\n", size); - return 0; + + return ret; } SPL_LOAD_IMAGE_METHOD("UART", 0, BOOT_DEVICE_UART, spl_ymodem_load_image); -- cgit v1.3.1 From d574c19b89549964b2cc30e3e542109cfc22466b Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Tue, 12 Mar 2019 04:00:09 +0100 Subject: spl: ymodem: Move GZ handling out of YModem session In case the gunzip() call fails, it will print an error message. If that happens within the YModem session, the error message will not be displayed and would be useless. Move the gunzip() call out of the YModem session to make those possible error messages visible. Signed-off-by: Marek Vasut Cc: Tom Rini --- common/spl/spl_ymodem.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'common') diff --git a/common/spl/spl_ymodem.c b/common/spl/spl_ymodem.c index 8058fd6a7c7..25226e9a335 100644 --- a/common/spl/spl_ymodem.c +++ b/common/spl/spl_ymodem.c @@ -75,7 +75,7 @@ static int spl_ymodem_load_image(struct spl_image_info *spl_image, int ret; connection_info_t info; char buf[BUF_SIZE]; - struct image_header *ih; + struct image_header *ih = NULL; ulong addr = 0; info.mode = xyzModem_ymodem; @@ -128,18 +128,6 @@ static int spl_ymodem_load_image(struct spl_image_info *spl_image, size += res; addr += res; } - -#ifdef CONFIG_SPL_GZIP - if (ih->ih_comp == IH_COMP_GZIP) { - if (gunzip((void *)(spl_image->load_addr + sizeof(*ih)), - CONFIG_SYS_BOOTM_LEN, - (void *)(CONFIG_SYS_LOAD_ADDR + sizeof(*ih)), - &size)) { - puts("Uncompressing error\n"); - return -EIO; - } - } -#endif } end_stream: @@ -148,6 +136,20 @@ end_stream: printf("Loaded %lu bytes\n", size); +#ifdef CONFIG_SPL_GZIP + if (!(IS_ENABLED(CONFIG_SPL_LOAD_FIT) && + image_get_magic((struct image_header *)buf) == FDT_MAGIC) && + (ih->ih_comp == IH_COMP_GZIP)) { + if (gunzip((void *)(spl_image->load_addr + sizeof(*ih)), + CONFIG_SYS_BOOTM_LEN, + (void *)(CONFIG_SYS_LOAD_ADDR + sizeof(*ih)), + &size)) { + puts("Uncompressing error\n"); + return -EIO; + } + } +#endif + return ret; } SPL_LOAD_IMAGE_METHOD("UART", 0, BOOT_DEVICE_UART, spl_ymodem_load_image); -- cgit v1.3.1