kernel: add bcm47xxpart patches sent for 4.5 merge window
authorRafał Miłecki <zajec5@gmail.com>
Mon, 7 Dec 2015 09:31:52 +0000 (09:31 +0000)
committerRafał Miłecki <zajec5@gmail.com>
Mon, 7 Dec 2015 09:31:52 +0000 (09:31 +0000)
This replaces old bcm53xx patch for scanning whole flash and makes
bcm47xxpart compatible with NAND.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
SVN-Revision: 47800

22 files changed:
target/linux/bcm53xx/patches-4.1/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch [deleted file]
target/linux/bcm53xx/patches-4.1/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch
target/linux/bcm53xx/patches-4.3/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch [deleted file]
target/linux/bcm53xx/patches-4.3/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch
target/linux/bcm53xx/patches-4.4/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch [deleted file]
target/linux/bcm53xx/patches-4.4/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch
target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch [new file with mode: 0644]
target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch [new file with mode: 0644]
target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch
target/linux/generic/patches-3.18/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
target/linux/generic/patches-4.1/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch [new file with mode: 0644]
target/linux/generic/patches-4.1/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch [new file with mode: 0644]
target/linux/generic/patches-4.1/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch
target/linux/generic/patches-4.1/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
target/linux/generic/patches-4.3/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch [new file with mode: 0644]
target/linux/generic/patches-4.3/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch [new file with mode: 0644]
target/linux/generic/patches-4.3/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch
target/linux/generic/patches-4.3/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
target/linux/generic/patches-4.4/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch
target/linux/generic/patches-4.4/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch

diff --git a/target/linux/bcm53xx/patches-4.1/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch b/target/linux/bcm53xx/patches-4.1/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch
deleted file mode 100644 (file)
index ccdb28b..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From d658c21d6697293a928434fd6ac19264b5a8948d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Fri, 30 Jan 2015 08:25:54 +0100
-Subject: [PATCH] mtd: bcm47xxpart: scan whole flash on ARCH_BCM_5301X
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
- drivers/mtd/bcm47xxpart.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -120,9 +120,15 @@ static int bcm47xxpart_parse(struct mtd_
-       /* Parse block by block looking for magics */
-       for (offset = 0; offset <= master->size - blocksize;
-            offset += blocksize) {
-+#ifndef CONFIG_ARCH_BCM_5301X
-+              /*
-+               * ARM routers may have partitions in higher memory. E.g.
-+               * Netgear R8000 has board_data at 0x2600000.
-+               */
-               /* Nothing more in higher memory */
-               if (offset >= 0x2000000)
-                       break;
-+#endif
-               if (curr_part >= BCM47XXPART_MAX_PARTS) {
-                       pr_warn("Reached maximum number of partitions, scanning stopped!\n");
index c1dfa92..774a186 100644 (file)
@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  
  #include <uapi/linux/magic.h>
  
-@@ -135,6 +136,17 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -132,6 +133,17 @@ static int bcm47xxpart_parse(struct mtd_
                        break;
                }
  
@@ -38,5 +38,5 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +              }
 +
                /* Read beginning of the block */
-               if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
-                            &bytes_read, (uint8_t *)buf) < 0) {
+               err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
+                              &bytes_read, (uint8_t *)buf);
diff --git a/target/linux/bcm53xx/patches-4.3/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch b/target/linux/bcm53xx/patches-4.3/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch
deleted file mode 100644 (file)
index ccdb28b..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From d658c21d6697293a928434fd6ac19264b5a8948d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Fri, 30 Jan 2015 08:25:54 +0100
-Subject: [PATCH] mtd: bcm47xxpart: scan whole flash on ARCH_BCM_5301X
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
- drivers/mtd/bcm47xxpart.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -120,9 +120,15 @@ static int bcm47xxpart_parse(struct mtd_
-       /* Parse block by block looking for magics */
-       for (offset = 0; offset <= master->size - blocksize;
-            offset += blocksize) {
-+#ifndef CONFIG_ARCH_BCM_5301X
-+              /*
-+               * ARM routers may have partitions in higher memory. E.g.
-+               * Netgear R8000 has board_data at 0x2600000.
-+               */
-               /* Nothing more in higher memory */
-               if (offset >= 0x2000000)
-                       break;
-+#endif
-               if (curr_part >= BCM47XXPART_MAX_PARTS) {
-                       pr_warn("Reached maximum number of partitions, scanning stopped!\n");
index c1dfa92..774a186 100644 (file)
@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  
  #include <uapi/linux/magic.h>
  
-@@ -135,6 +136,17 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -132,6 +133,17 @@ static int bcm47xxpart_parse(struct mtd_
                        break;
                }
  
@@ -38,5 +38,5 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +              }
 +
                /* Read beginning of the block */
-               if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
-                            &bytes_read, (uint8_t *)buf) < 0) {
+               err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
+                              &bytes_read, (uint8_t *)buf);
diff --git a/target/linux/bcm53xx/patches-4.4/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch b/target/linux/bcm53xx/patches-4.4/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch
deleted file mode 100644 (file)
index ccdb28b..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From d658c21d6697293a928434fd6ac19264b5a8948d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Fri, 30 Jan 2015 08:25:54 +0100
-Subject: [PATCH] mtd: bcm47xxpart: scan whole flash on ARCH_BCM_5301X
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
- drivers/mtd/bcm47xxpart.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -120,9 +120,15 @@ static int bcm47xxpart_parse(struct mtd_
-       /* Parse block by block looking for magics */
-       for (offset = 0; offset <= master->size - blocksize;
-            offset += blocksize) {
-+#ifndef CONFIG_ARCH_BCM_5301X
-+              /*
-+               * ARM routers may have partitions in higher memory. E.g.
-+               * Netgear R8000 has board_data at 0x2600000.
-+               */
-               /* Nothing more in higher memory */
-               if (offset >= 0x2000000)
-                       break;
-+#endif
-               if (curr_part >= BCM47XXPART_MAX_PARTS) {
-                       pr_warn("Reached maximum number of partitions, scanning stopped!\n");
index c1dfa92..774a186 100644 (file)
@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  
  #include <uapi/linux/magic.h>
  
-@@ -135,6 +136,17 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -132,6 +133,17 @@ static int bcm47xxpart_parse(struct mtd_
                        break;
                }
  
@@ -38,5 +38,5 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +              }
 +
                /* Read beginning of the block */
-               if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
-                            &bytes_read, (uint8_t *)buf) < 0) {
+               err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
+                              &bytes_read, (uint8_t *)buf);
diff --git a/target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch b/target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
new file mode 100644 (file)
index 0000000..aa31514
--- /dev/null
@@ -0,0 +1,33 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sat, 5 Dec 2015 02:03:32 +0100
+Subject: [PATCH] mtd: bcm47xxpart: limit scanned flash area on BCM47XX (MIPS)
+ only
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We allowed using bcm47xxpart on BCM5301X arch with commit:
+9e3afa5f5c7 ("mtd: bcm47xxpart: allow enabling on ARCH_BCM_5301X")
+
+BCM5301X devices may contain some partitions in higher memory, e.g.
+Netgear R8000 has board_data at 0x2600000. To detect them we should
+use size limit on MIPS only.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -118,8 +118,8 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+       /* Parse block by block looking for magics */
+       for (offset = 0; offset <= master->size - blocksize;
+            offset += blocksize) {
+-              /* Nothing more in higher memory */
+-              if (offset >= 0x2000000)
++              /* Nothing more in higher memory on BCM47XX (MIPS) */
++              if (config_enabled(CONFIG_BCM47XX) && offset >= 0x2000000)
+                       break;
+               if (curr_part >= BCM47XXPART_MAX_PARTS) {
diff --git a/target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch b/target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
new file mode 100644 (file)
index 0000000..f9e81f9
--- /dev/null
@@ -0,0 +1,97 @@
+From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sun, 6 Dec 2015 11:24:05 +0100
+Subject: [PATCH] mtd: bcm47xxpart: don't fail because of bit-flips
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Bit-flip errors may occur on NAND flashes and are harmless. Handle them
+gracefully as read content is still reliable and can be parsed.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 38 ++++++++++++++++++++++----------------
+ 1 file changed, 22 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/mtd/bcm47xxpart.c b/drivers/mtd/bcm47xxpart.c
+index 4450e74..1ab3451 100644
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
+ {
+       uint32_t buf;
+       size_t bytes_read;
++      int err;
+-      if (mtd_read(master, offset, sizeof(buf), &bytes_read,
+-                   (uint8_t *)&buf) < 0) {
+-              pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                      offset);
++      err  = mtd_read(master, offset, sizeof(buf), &bytes_read,
++                      (uint8_t *)&buf);
++      if (err && !mtd_is_bitflip(err)) {
++              pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                      offset, err);
+               goto out_default;
+       }
+@@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+       int trx_part = -1;
+       int last_trx_part = -1;
+       int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
++      int err;
+       /*
+        * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
+@@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               /* Read beginning of the block */
+-              if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
+-                           &bytes_read, (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                             offset);
++              err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
++                             &bytes_read, (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+@@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               /* Read middle of the block */
+-              if (mtd_read(master, offset + 0x8000, 0x4,
+-                           &bytes_read, (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                             offset);
++              err = mtd_read(master, offset + 0x8000, 0x4, &bytes_read,
++                             (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+@@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               offset = master->size - possible_nvram_sizes[i];
+-              if (mtd_read(master, offset, 0x4, &bytes_read,
+-                           (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while reading at offset 0x%X!\n",
+-                             offset);
++              err = mtd_read(master, offset, 0x4, &bytes_read,
++                             (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while reading (offset 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+-- 
+1.8.4.5
+
index a30e698..bc3e502 100644 (file)
@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  #define CFE_MAGIC                     0x43464531      /* 1EFC */
  #define FACTORY_MAGIC                 0x59544346      /* FCTY */
  #define NVRAM_HEADER                  0x48534C46      /* FLSH */
-@@ -262,7 +263,8 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -267,7 +268,8 @@ static int bcm47xxpart_parse(struct mtd_
                }
  
                /* Some devices (ex. WNDR3700v3) don't have a standard 'MPFR' */
index 1edc995..2b04286 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  #define ML_MAGIC1                     0x39685a42
  #define ML_MAGIC2                     0x26594131
  #define TRX_MAGIC                     0x30524448
-@@ -176,6 +177,15 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -180,6 +181,15 @@ static int bcm47xxpart_parse(struct mtd_
                                             MTD_WRITEABLE);
                        continue;
                }
diff --git a/target/linux/generic/patches-4.1/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch b/target/linux/generic/patches-4.1/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
new file mode 100644 (file)
index 0000000..aa31514
--- /dev/null
@@ -0,0 +1,33 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sat, 5 Dec 2015 02:03:32 +0100
+Subject: [PATCH] mtd: bcm47xxpart: limit scanned flash area on BCM47XX (MIPS)
+ only
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We allowed using bcm47xxpart on BCM5301X arch with commit:
+9e3afa5f5c7 ("mtd: bcm47xxpart: allow enabling on ARCH_BCM_5301X")
+
+BCM5301X devices may contain some partitions in higher memory, e.g.
+Netgear R8000 has board_data at 0x2600000. To detect them we should
+use size limit on MIPS only.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -118,8 +118,8 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+       /* Parse block by block looking for magics */
+       for (offset = 0; offset <= master->size - blocksize;
+            offset += blocksize) {
+-              /* Nothing more in higher memory */
+-              if (offset >= 0x2000000)
++              /* Nothing more in higher memory on BCM47XX (MIPS) */
++              if (config_enabled(CONFIG_BCM47XX) && offset >= 0x2000000)
+                       break;
+               if (curr_part >= BCM47XXPART_MAX_PARTS) {
diff --git a/target/linux/generic/patches-4.1/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch b/target/linux/generic/patches-4.1/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
new file mode 100644 (file)
index 0000000..f9e81f9
--- /dev/null
@@ -0,0 +1,97 @@
+From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sun, 6 Dec 2015 11:24:05 +0100
+Subject: [PATCH] mtd: bcm47xxpart: don't fail because of bit-flips
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Bit-flip errors may occur on NAND flashes and are harmless. Handle them
+gracefully as read content is still reliable and can be parsed.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 38 ++++++++++++++++++++++----------------
+ 1 file changed, 22 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/mtd/bcm47xxpart.c b/drivers/mtd/bcm47xxpart.c
+index 4450e74..1ab3451 100644
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
+ {
+       uint32_t buf;
+       size_t bytes_read;
++      int err;
+-      if (mtd_read(master, offset, sizeof(buf), &bytes_read,
+-                   (uint8_t *)&buf) < 0) {
+-              pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                      offset);
++      err  = mtd_read(master, offset, sizeof(buf), &bytes_read,
++                      (uint8_t *)&buf);
++      if (err && !mtd_is_bitflip(err)) {
++              pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                      offset, err);
+               goto out_default;
+       }
+@@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+       int trx_part = -1;
+       int last_trx_part = -1;
+       int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
++      int err;
+       /*
+        * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
+@@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               /* Read beginning of the block */
+-              if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
+-                           &bytes_read, (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                             offset);
++              err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
++                             &bytes_read, (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+@@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               /* Read middle of the block */
+-              if (mtd_read(master, offset + 0x8000, 0x4,
+-                           &bytes_read, (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                             offset);
++              err = mtd_read(master, offset + 0x8000, 0x4, &bytes_read,
++                             (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+@@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               offset = master->size - possible_nvram_sizes[i];
+-              if (mtd_read(master, offset, 0x4, &bytes_read,
+-                           (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while reading at offset 0x%X!\n",
+-                             offset);
++              err = mtd_read(master, offset, 0x4, &bytes_read,
++                             (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while reading (offset 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+-- 
+1.8.4.5
+
index a30e698..bc3e502 100644 (file)
@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  #define CFE_MAGIC                     0x43464531      /* 1EFC */
  #define FACTORY_MAGIC                 0x59544346      /* FCTY */
  #define NVRAM_HEADER                  0x48534C46      /* FLSH */
-@@ -262,7 +263,8 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -267,7 +268,8 @@ static int bcm47xxpart_parse(struct mtd_
                }
  
                /* Some devices (ex. WNDR3700v3) don't have a standard 'MPFR' */
index 1edc995..2b04286 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  #define ML_MAGIC1                     0x39685a42
  #define ML_MAGIC2                     0x26594131
  #define TRX_MAGIC                     0x30524448
-@@ -176,6 +177,15 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -180,6 +181,15 @@ static int bcm47xxpart_parse(struct mtd_
                                             MTD_WRITEABLE);
                        continue;
                }
diff --git a/target/linux/generic/patches-4.3/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch b/target/linux/generic/patches-4.3/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
new file mode 100644 (file)
index 0000000..aa31514
--- /dev/null
@@ -0,0 +1,33 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sat, 5 Dec 2015 02:03:32 +0100
+Subject: [PATCH] mtd: bcm47xxpart: limit scanned flash area on BCM47XX (MIPS)
+ only
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We allowed using bcm47xxpart on BCM5301X arch with commit:
+9e3afa5f5c7 ("mtd: bcm47xxpart: allow enabling on ARCH_BCM_5301X")
+
+BCM5301X devices may contain some partitions in higher memory, e.g.
+Netgear R8000 has board_data at 0x2600000. To detect them we should
+use size limit on MIPS only.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -118,8 +118,8 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+       /* Parse block by block looking for magics */
+       for (offset = 0; offset <= master->size - blocksize;
+            offset += blocksize) {
+-              /* Nothing more in higher memory */
+-              if (offset >= 0x2000000)
++              /* Nothing more in higher memory on BCM47XX (MIPS) */
++              if (config_enabled(CONFIG_BCM47XX) && offset >= 0x2000000)
+                       break;
+               if (curr_part >= BCM47XXPART_MAX_PARTS) {
diff --git a/target/linux/generic/patches-4.3/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch b/target/linux/generic/patches-4.3/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
new file mode 100644 (file)
index 0000000..f9e81f9
--- /dev/null
@@ -0,0 +1,97 @@
+From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sun, 6 Dec 2015 11:24:05 +0100
+Subject: [PATCH] mtd: bcm47xxpart: don't fail because of bit-flips
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Bit-flip errors may occur on NAND flashes and are harmless. Handle them
+gracefully as read content is still reliable and can be parsed.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 38 ++++++++++++++++++++++----------------
+ 1 file changed, 22 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/mtd/bcm47xxpart.c b/drivers/mtd/bcm47xxpart.c
+index 4450e74..1ab3451 100644
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
+ {
+       uint32_t buf;
+       size_t bytes_read;
++      int err;
+-      if (mtd_read(master, offset, sizeof(buf), &bytes_read,
+-                   (uint8_t *)&buf) < 0) {
+-              pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                      offset);
++      err  = mtd_read(master, offset, sizeof(buf), &bytes_read,
++                      (uint8_t *)&buf);
++      if (err && !mtd_is_bitflip(err)) {
++              pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                      offset, err);
+               goto out_default;
+       }
+@@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+       int trx_part = -1;
+       int last_trx_part = -1;
+       int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
++      int err;
+       /*
+        * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
+@@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               /* Read beginning of the block */
+-              if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
+-                           &bytes_read, (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                             offset);
++              err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
++                             &bytes_read, (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+@@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               /* Read middle of the block */
+-              if (mtd_read(master, offset + 0x8000, 0x4,
+-                           &bytes_read, (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                             offset);
++              err = mtd_read(master, offset + 0x8000, 0x4, &bytes_read,
++                             (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+@@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               offset = master->size - possible_nvram_sizes[i];
+-              if (mtd_read(master, offset, 0x4, &bytes_read,
+-                           (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while reading at offset 0x%X!\n",
+-                             offset);
++              err = mtd_read(master, offset, 0x4, &bytes_read,
++                             (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while reading (offset 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+-- 
+1.8.4.5
+
index a30e698..bc3e502 100644 (file)
@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  #define CFE_MAGIC                     0x43464531      /* 1EFC */
  #define FACTORY_MAGIC                 0x59544346      /* FCTY */
  #define NVRAM_HEADER                  0x48534C46      /* FLSH */
-@@ -262,7 +263,8 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -267,7 +268,8 @@ static int bcm47xxpart_parse(struct mtd_
                }
  
                /* Some devices (ex. WNDR3700v3) don't have a standard 'MPFR' */
index 1edc995..2b04286 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  #define ML_MAGIC1                     0x39685a42
  #define ML_MAGIC2                     0x26594131
  #define TRX_MAGIC                     0x30524448
-@@ -176,6 +177,15 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -180,6 +181,15 @@ static int bcm47xxpart_parse(struct mtd_
                                             MTD_WRITEABLE);
                        continue;
                }
diff --git a/target/linux/generic/patches-4.4/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch b/target/linux/generic/patches-4.4/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
new file mode 100644 (file)
index 0000000..aa31514
--- /dev/null
@@ -0,0 +1,33 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sat, 5 Dec 2015 02:03:32 +0100
+Subject: [PATCH] mtd: bcm47xxpart: limit scanned flash area on BCM47XX (MIPS)
+ only
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We allowed using bcm47xxpart on BCM5301X arch with commit:
+9e3afa5f5c7 ("mtd: bcm47xxpart: allow enabling on ARCH_BCM_5301X")
+
+BCM5301X devices may contain some partitions in higher memory, e.g.
+Netgear R8000 has board_data at 0x2600000. To detect them we should
+use size limit on MIPS only.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -118,8 +118,8 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+       /* Parse block by block looking for magics */
+       for (offset = 0; offset <= master->size - blocksize;
+            offset += blocksize) {
+-              /* Nothing more in higher memory */
+-              if (offset >= 0x2000000)
++              /* Nothing more in higher memory on BCM47XX (MIPS) */
++              if (config_enabled(CONFIG_BCM47XX) && offset >= 0x2000000)
+                       break;
+               if (curr_part >= BCM47XXPART_MAX_PARTS) {
diff --git a/target/linux/generic/patches-4.4/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch b/target/linux/generic/patches-4.4/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
new file mode 100644 (file)
index 0000000..f9e81f9
--- /dev/null
@@ -0,0 +1,97 @@
+From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sun, 6 Dec 2015 11:24:05 +0100
+Subject: [PATCH] mtd: bcm47xxpart: don't fail because of bit-flips
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Bit-flip errors may occur on NAND flashes and are harmless. Handle them
+gracefully as read content is still reliable and can be parsed.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 38 ++++++++++++++++++++++----------------
+ 1 file changed, 22 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/mtd/bcm47xxpart.c b/drivers/mtd/bcm47xxpart.c
+index 4450e74..1ab3451 100644
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
+ {
+       uint32_t buf;
+       size_t bytes_read;
++      int err;
+-      if (mtd_read(master, offset, sizeof(buf), &bytes_read,
+-                   (uint8_t *)&buf) < 0) {
+-              pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                      offset);
++      err  = mtd_read(master, offset, sizeof(buf), &bytes_read,
++                      (uint8_t *)&buf);
++      if (err && !mtd_is_bitflip(err)) {
++              pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                      offset, err);
+               goto out_default;
+       }
+@@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+       int trx_part = -1;
+       int last_trx_part = -1;
+       int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
++      int err;
+       /*
+        * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
+@@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               /* Read beginning of the block */
+-              if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
+-                           &bytes_read, (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                             offset);
++              err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
++                             &bytes_read, (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+@@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               /* Read middle of the block */
+-              if (mtd_read(master, offset + 0x8000, 0x4,
+-                           &bytes_read, (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+-                             offset);
++              err = mtd_read(master, offset + 0x8000, 0x4, &bytes_read,
++                             (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+@@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+               }
+               offset = master->size - possible_nvram_sizes[i];
+-              if (mtd_read(master, offset, 0x4, &bytes_read,
+-                           (uint8_t *)buf) < 0) {
+-                      pr_err("mtd_read error while reading at offset 0x%X!\n",
+-                             offset);
++              err = mtd_read(master, offset, 0x4, &bytes_read,
++                             (uint8_t *)buf);
++              if (err && !mtd_is_bitflip(err)) {
++                      pr_err("mtd_read error while reading (offset 0x%X): %d\n",
++                             offset, err);
+                       continue;
+               }
+-- 
+1.8.4.5
+
index a30e698..bc3e502 100644 (file)
@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  #define CFE_MAGIC                     0x43464531      /* 1EFC */
  #define FACTORY_MAGIC                 0x59544346      /* FCTY */
  #define NVRAM_HEADER                  0x48534C46      /* FLSH */
-@@ -262,7 +263,8 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -267,7 +268,8 @@ static int bcm47xxpart_parse(struct mtd_
                }
  
                /* Some devices (ex. WNDR3700v3) don't have a standard 'MPFR' */
index 1edc995..2b04286 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  #define ML_MAGIC1                     0x39685a42
  #define ML_MAGIC2                     0x26594131
  #define TRX_MAGIC                     0x30524448
-@@ -176,6 +177,15 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -180,6 +181,15 @@ static int bcm47xxpart_parse(struct mtd_
                                             MTD_WRITEABLE);
                        continue;
                }