Просмотр исходного кода

kernel: add bcm47xxpart patches sent for 4.5 merge window

This replaces old bcm53xx patch for scanning whole flash and makes
bcm47xxpart compatible with NAND.

Signed-off-by: Rafał Miłecki <[email protected]>

SVN-Revision: 47800
Rafał Miłecki 10 лет назад
Родитель
Сommit
3333f75caf
22 измененных файлов с 537 добавлено и 110 удалено
  1. 0 31
      target/linux/bcm53xx/patches-4.1/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch
  2. 3 3
      target/linux/bcm53xx/patches-4.1/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch
  3. 0 31
      target/linux/bcm53xx/patches-4.3/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch
  4. 3 3
      target/linux/bcm53xx/patches-4.3/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch
  5. 0 31
      target/linux/bcm53xx/patches-4.4/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch
  6. 3 3
      target/linux/bcm53xx/patches-4.4/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch
  7. 33 0
      target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
  8. 97 0
      target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
  9. 1 1
      target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch
  10. 1 1
      target/linux/generic/patches-3.18/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
  11. 33 0
      target/linux/generic/patches-4.1/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
  12. 97 0
      target/linux/generic/patches-4.1/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
  13. 1 1
      target/linux/generic/patches-4.1/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch
  14. 1 1
      target/linux/generic/patches-4.1/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
  15. 33 0
      target/linux/generic/patches-4.3/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
  16. 97 0
      target/linux/generic/patches-4.3/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
  17. 1 1
      target/linux/generic/patches-4.3/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch
  18. 1 1
      target/linux/generic/patches-4.3/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
  19. 33 0
      target/linux/generic/patches-4.4/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
  20. 97 0
      target/linux/generic/patches-4.4/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
  21. 1 1
      target/linux/generic/patches-4.4/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch
  22. 1 1
      target/linux/generic/patches-4.4/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch

+ 0 - 31
target/linux/bcm53xx/patches-4.1/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch

@@ -1,31 +0,0 @@
-From d658c21d6697293a928434fd6ac19264b5a8948d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
-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 <[email protected]>
----
- 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");

+ 3 - 3
target/linux/bcm53xx/patches-4.1/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch

@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  
  #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 <[email protected]>
 +		}
 +
  		/* 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);

+ 0 - 31
target/linux/bcm53xx/patches-4.3/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch

@@ -1,31 +0,0 @@
-From d658c21d6697293a928434fd6ac19264b5a8948d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
-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 <[email protected]>
----
- 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");

+ 3 - 3
target/linux/bcm53xx/patches-4.3/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch

@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  
  #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 <[email protected]>
 +		}
 +
  		/* 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);

+ 0 - 31
target/linux/bcm53xx/patches-4.4/400-mtd-bcm47xxpart-scan-whole-flash-on-ARCH_BCM_5301X.patch

@@ -1,31 +0,0 @@
-From d658c21d6697293a928434fd6ac19264b5a8948d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
-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 <[email protected]>
----
- 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");

+ 3 - 3
target/linux/bcm53xx/patches-4.4/901-mtd-bcm47xxpart-workaround-for-Asus-RT-AC87U-asus-pa.patch

@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  
  #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 <[email protected]>
 +		}
 +
  		/* 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);

+ 33 - 0
target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch

@@ -0,0 +1,33 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
+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 <[email protected]>
+---
+ 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) {

+ 97 - 0
target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch

@@ -0,0 +1,97 @@
+From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
+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 <[email protected]>
+---
+ 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
+

+ 1 - 1
target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch

@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  #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' */

+ 1 - 1
target/linux/generic/patches-3.18/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch

@@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  #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;
  		}

+ 33 - 0
target/linux/generic/patches-4.1/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch

@@ -0,0 +1,33 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
+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 <[email protected]>
+---
+ 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) {

+ 97 - 0
target/linux/generic/patches-4.1/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch

@@ -0,0 +1,97 @@
+From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
+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 <[email protected]>
+---
+ 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
+

+ 1 - 1
target/linux/generic/patches-4.1/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch

@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  #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' */

+ 1 - 1
target/linux/generic/patches-4.1/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch

@@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  #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;
  		}

+ 33 - 0
target/linux/generic/patches-4.3/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch

@@ -0,0 +1,33 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
+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 <[email protected]>
+---
+ 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) {

+ 97 - 0
target/linux/generic/patches-4.3/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch

@@ -0,0 +1,97 @@
+From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
+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 <[email protected]>
+---
+ 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
+

+ 1 - 1
target/linux/generic/patches-4.3/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch

@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  #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' */

+ 1 - 1
target/linux/generic/patches-4.3/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch

@@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  #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;
  		}

+ 33 - 0
target/linux/generic/patches-4.4/143-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch

@@ -0,0 +1,33 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
+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 <[email protected]>
+---
+ 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) {

+ 97 - 0
target/linux/generic/patches-4.4/144-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch

@@ -0,0 +1,97 @@
+From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
+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 <[email protected]>
+---
+ 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
+

+ 1 - 1
target/linux/generic/patches-4.4/431-mtd-bcm47xxpart-support-for-Xiaomi-specific-board_da.patch

@@ -22,7 +22,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  #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' */

+ 1 - 1
target/linux/generic/patches-4.4/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch

@@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <[email protected]>
  #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;
  		}