aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2015-10-05 11:34:16 +0000
committerFelix Fietkau <nbd@openwrt.org>2015-10-05 11:34:16 +0000
commit38389c79c2ee89a662807e7dc4e82a5d11786ff8 (patch)
tree7dcfa5298fe54b6d51869b6093df71cc993ae04d /target/linux
parent8181976067d879d902f192693c6b0d06bee181b9 (diff)
downloadupstream-38389c79c2ee89a662807e7dc4e82a5d11786ff8.tar.gz
upstream-38389c79c2ee89a662807e7dc4e82a5d11786ff8.tar.bz2
upstream-38389c79c2ee89a662807e7dc4e82a5d11786ff8.zip
ramips: improve read performance of the m25p80 chunked io patch
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 47137
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch65
1 files changed, 58 insertions, 7 deletions
diff --git a/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch b/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch
index 1716e1cc49..2e81e456d3 100644
--- a/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch
+++ b/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch
@@ -16,10 +16,56 @@
u8 command[MAX_CMD_SIZE];
};
-@@ -157,6 +159,61 @@ static int m25p80_read(struct spi_nor *n
- return 0;
+@@ -117,25 +119,14 @@ static inline unsigned int m25p80_rx_nbi
+ }
}
+-/*
+- * 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)
++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;
+ struct spi_device *spi = flash->spi;
+ struct spi_transfer t[2];
+ struct spi_message m;
+ int dummy = nor->read_dummy;
+- int ret;
+-
+- /* Wait till previous write/erase is done. */
+- ret = nor->wait_till_ready(nor);
+- if (ret)
+- return ret;
+-
+ spi_message_init(&m);
+ memset(t, 0, (sizeof t));
+
+@@ -156,6 +147,84 @@ static int m25p80_read(struct spi_nor *n
+ *retlen = m.actual_length - m25p_cmdsz(nor) - dummy;
+ return 0;
+ }
++/*
++ * 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)
++{
++ int ret;
++
++ /* Wait till previous write/erase is done. */
++ ret = nor->wait_till_ready(nor);
++ if (ret)
++ return ret;
++
++ return __m25p80_read(nor, from, len, retlen, buf);
++}
++
++
+static void m25p80_chunked_write(struct spi_nor *nor, loff_t _from, size_t _len,
+ size_t *_retlen, const u_char *_buf)
+{
@@ -52,6 +98,12 @@
+{
+ struct m25p *flash = nor->priv;
+ int chunk_size;
++ int ret;
++
++ /* Wait till previous write/erase is done. */
++ ret = nor->wait_till_ready(nor);
++ if (ret)
++ return ret;
+
+ chunk_size = flash->chunk_size;
+ if (!chunk_size)
@@ -64,7 +116,7 @@
+ u_char *buf = _buf + *_retlen;
+ loff_t from = _from + *_retlen;
+ int retlen = 0;
-+ int ret = m25p80_read(nor, from, len, &retlen, buf);
++ int ret = __m25p80_read(nor, from, len, &retlen, buf);
+
+ if (ret)
+ return ret;
@@ -74,11 +126,10 @@
+
+ return 0;
+}
-+
+
static int m25p80_erase(struct spi_nor *nor, loff_t offset)
{
- struct m25p *flash = nor->priv;
-@@ -197,6 +254,7 @@ static int m25p_probe(struct spi_device
+@@ -197,6 +266,7 @@ static int m25p_probe(struct spi_device
struct spi_nor *nor;
enum read_mode mode = SPI_NOR_NORMAL;
char *flash_name = NULL;
@@ -86,7 +137,7 @@
int ret;
data = dev_get_platdata(&spi->dev);
-@@ -244,6 +302,14 @@ static int m25p_probe(struct spi_device
+@@ -244,6 +314,14 @@ static int m25p_probe(struct spi_device
if (ret)
return ret;