dfu: dfu_sf: Read the SPI flash in 16 MiB chunks
authorMarek Vasut <marex@denx.de>
Tue, 14 Sep 2021 03:26:51 +0000 (05:26 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 25 Oct 2021 22:13:12 +0000 (18:13 -0400)
Not all SPI flashes and controllers can do continuous transfer longer
than 16 MiB, so perform the DFU read in 16 MiB chunks.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Lukasz Majewski <lukma@denx.de>
drivers/dfu/dfu_sf.c

index 7e64ab7..b72493c 100644 (file)
@@ -24,8 +24,18 @@ static int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)
 static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
                              long *len)
 {
 static int dfu_read_medium_sf(struct dfu_entity *dfu, u64 offset, void *buf,
                              long *len)
 {
-       return spi_flash_read(dfu->data.sf.dev, dfu->data.sf.start + offset,
-               *len, buf);
+       long seglen = *len;
+       int ret;
+
+       if (seglen > (16 << 20))
+               seglen = (16 << 20);
+
+       ret = spi_flash_read(dfu->data.sf.dev, dfu->data.sf.start + offset,
+               seglen, buf);
+       if (!ret)
+               *len = seglen;
+
+       return ret;
 }
 
 static u64 find_sector(struct dfu_entity *dfu, u64 start, u64 offset)
 }
 
 static u64 find_sector(struct dfu_entity *dfu, u64 start, u64 offset)