@@ -115,11 +115,7 @@ static inline unsigned int m25p80_rx_nbits(struct spi_nor *nor)
}
}
-/*
- * Read an address range from the nor chip. The address range
- * may be any size provided it is within the physical boundaries.
- */
-static int m25p80_read(struct spi_nor *nor, loff_t from, size_t len,
+static int _m25p80_read(struct spi_nor *nor, loff_t from, size_t len,
size_t *retlen, u_char *buf)
{
struct m25p *flash = nor->priv;
@@ -153,6 +149,39 @@ static int m25p80_read(struct spi_nor *nor, loff_t from, size_t len,
}
/*
+ * Read an address range from the nor chip. The address range
+ * may be any size provided it is within the physical boundaries.
+ */
+static int m25p80_read(struct spi_nor *nor, loff_t from, size_t len,
+ size_t *retlen, u_char *buf)
+{
+ struct m25p *flash = nor->priv;
+ size_t cmd_len, xfer_len, max_len;
+ int ret = 0;
+
+ /* convert the dummy cycles to the number of bytes */
+ cmd_len = m25p_cmdsz(nor) + nor->read_dummy / 8;
+
+ max_len = flash->spi->master->max_msg_size ?: SIZE_MAX;
+
+ if (unlikely(max_len < cmd_len))
+ return -EINVAL;
+
+ max_len -= cmd_len;
+
+ while (len) {
+ xfer_len = min(len, max_len);
+ ret = _m25p80_read(nor, from, xfer_len, retlen, buf);
+ if (ret < 0)
+ break;
+ from += xfer_len;
+ len -= xfer_len;
+ }
+
+ return ret;
+}
+
+/*
* board specific setup should have ensured the SPI clock used here
* matches what the READ command supports, at least until this driver
* understands FAST_READ (for clocks over 25 MHz).
Extend m25p80_read allowing to read in chunks in case the SPI HW has a max supported message size. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- drivers/mtd/devices/m25p80.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-)