spl: ymodem: Fix loading of fit image
authorLokesh Vutla <lokeshvutla@ti.com>
Thu, 14 Nov 2019 13:03:30 +0000 (18:33 +0530)
committerTom Rini <trini@konsulko.com>
Tue, 3 Dec 2019 13:44:14 +0000 (08:44 -0500)
spl ymodem driver always assumes that 1 BUF_SIZE is read in one stream.
This might not be true when image is not padded to BUF_SIZE and the last
sector that gets loaded will be < BUF_SIZE. Drop this assumption and use
the actual size that is loaded.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
common/spl/spl_ymodem.c

index c02c05624d48b1997efb227ea1680af3cb326b9b..8500ee8ba5d917ee95e93bb6a08e0a47e7869bfe 100644 (file)
@@ -37,7 +37,7 @@ static int getcymodem(void) {
 static ulong ymodem_read_fit(struct spl_load_info *load, ulong offset,
                             ulong size, void *addr)
 {
-       int res, err;
+       int res, err, buf_offset;
        struct ymodem_fit_info *info = load->priv;
        char *buf = info->buf;
 
@@ -51,7 +51,11 @@ static ulong ymodem_read_fit(struct spl_load_info *load, ulong offset,
 
        if (info->image_read > offset) {
                res = info->image_read - offset;
-               memcpy(addr, &buf[BUF_SIZE - res], res);
+               if (info->image_read % BUF_SIZE)
+                       buf_offset = (info->image_read % BUF_SIZE);
+               else
+                       buf_offset = BUF_SIZE;
+               memcpy(addr, &buf[buf_offset - res], res);
                addr = addr + res;
        }