[PATCH] dfu: dfu_sf: Read the SPI flash in 16 MiB chunks

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 --- drivers/dfu/dfu_sf.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/dfu/dfu_sf.c b/drivers/dfu/dfu_sf.c index 7e64ab772f0..b72493ced86 100644 --- a/drivers/dfu/dfu_sf.c +++ b/drivers/dfu/dfu_sf.c @@ -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) { - 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)

On Tue, 14 Sep 2021 05:26:51 +0200 Marek Vasut marex@denx.de wrote:
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
drivers/dfu/dfu_sf.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/dfu/dfu_sf.c b/drivers/dfu/dfu_sf.c index 7e64ab772f0..b72493ced86 100644 --- a/drivers/dfu/dfu_sf.c +++ b/drivers/dfu/dfu_sf.c @@ -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) {
- 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)
Reviewed-by: Lukasz Majewski lukma@denx.de
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de

On 9/14/21 11:31 AM, Lukasz Majewski wrote:
On Tue, 14 Sep 2021 05:26:51 +0200 Marek Vasut marex@denx.de wrote:
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
drivers/dfu/dfu_sf.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/dfu/dfu_sf.c b/drivers/dfu/dfu_sf.c index 7e64ab772f0..b72493ced86 100644 --- a/drivers/dfu/dfu_sf.c +++ b/drivers/dfu/dfu_sf.c @@ -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) {
- 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)
Reviewed-by: Lukasz Majewski lukma@denx.de
Is there going to be a PR with this or shall Tom pick it directly, since it is just one patch ?

Hi Marek,
On 9/14/21 11:31 AM, Lukasz Majewski wrote:
On Tue, 14 Sep 2021 05:26:51 +0200 Marek Vasut marex@denx.de wrote:
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
drivers/dfu/dfu_sf.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/dfu/dfu_sf.c b/drivers/dfu/dfu_sf.c index 7e64ab772f0..b72493ced86 100644 --- a/drivers/dfu/dfu_sf.c +++ b/drivers/dfu/dfu_sf.c @@ -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) {
- 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)
Reviewed-by: Lukasz Majewski lukma@denx.de
Is there going to be a PR with this or shall Tom pick it directly, since it is just one patch ?
Please, Tom pick it up...
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de

On Tue, Sep 14, 2021 at 05:26:51AM +0200, Marek Vasut wrote:
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
Applied to u-boot/master, thanks!
participants (3)
-
Lukasz Majewski
-
Marek Vasut
-
Tom Rini