From 2a2b16210bbc8c5881286d2ff742f3bdf1a7fd9c Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Tue, 7 Feb 2017 12:01:46 +0100 Subject: brcm63xx: backport upstream solution for SPI message size limits Backport upstream solution for working around SPI controller maximum message sizes. Signed-off-by: Jonas Gorski --- .../000-4.8-09-mtd-spi-nor-add-read-loop.patch | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 target/linux/brcm63xx/patches-4.4/000-4.8-09-mtd-spi-nor-add-read-loop.patch (limited to 'target/linux/brcm63xx/patches-4.4/000-4.8-09-mtd-spi-nor-add-read-loop.patch') diff --git a/target/linux/brcm63xx/patches-4.4/000-4.8-09-mtd-spi-nor-add-read-loop.patch b/target/linux/brcm63xx/patches-4.4/000-4.8-09-mtd-spi-nor-add-read-loop.patch new file mode 100644 index 0000000000..662c73ada9 --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/000-4.8-09-mtd-spi-nor-add-read-loop.patch @@ -0,0 +1,54 @@ +From 26f9bcad29a6c240881bd4efc90f16a9990dd6c2 Mon Sep 17 00:00:00 2001 +From: Michal Suchanek +Date: Thu, 5 May 2016 17:31:55 -0700 +Subject: [PATCH 09/10] mtd: spi-nor: add read loop + +mtdblock and ubi do not handle the situation when read returns less data +than requested. Loop in spi-nor until buffer is filled or an error is +returned. + +Signed-off-by: Michal Suchanek +Signed-off-by: Brian Norris +Tested-by Cyrille Pitchen +Acked-by: Michal Suchanek +Tested-by: Michal Suchanek +--- + drivers/mtd/spi-nor/spi-nor.c | 25 +++++++++++++++++++------ + 1 file changed, 19 insertions(+), 6 deletions(-) + +--- a/drivers/mtd/spi-nor/spi-nor.c ++++ b/drivers/mtd/spi-nor/spi-nor.c +@@ -890,14 +890,27 @@ static int spi_nor_read(struct mtd_info + if (ret) + return ret; + +- ret = nor->read(nor, from, len, buf); ++ while (len) { ++ ret = nor->read(nor, from, len, buf); ++ if (ret == 0) { ++ /* We shouldn't see 0-length reads */ ++ ret = -EIO; ++ goto read_err; ++ } ++ if (ret < 0) ++ goto read_err; + +- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ); +- if (ret < 0) +- return ret; ++ WARN_ON(ret > len); ++ *retlen += ret; ++ buf += ret; ++ from += ret; ++ len -= ret; ++ } ++ ret = 0; + +- *retlen += ret; +- return 0; ++read_err: ++ spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ); ++ return ret; + } + + static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, -- cgit v1.2.3