summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhauke <hauke@3c298f89-4303-0410-b956-a3cf2f4a3e73>2014-01-12 18:50:45 +0000
committerhauke <hauke@3c298f89-4303-0410-b956-a3cf2f4a3e73>2014-01-12 18:50:45 +0000
commit188021a18c27dc529e94a2d6ee39a7e5f222db60 (patch)
treee9b37577fc52e745c79274ae458da97281b9c854
parentdc99be38c7654498bc98347f080bb43b7b209c41 (diff)
brcm47xx: update mtd drivers
This backports some patches from linux upstream. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@39249 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--target/linux/brcm47xx/patches-3.10/020-mtd-bcm47xxpart-handle-malloc-failures.patch30
-rw-r--r--target/linux/brcm47xx/patches-3.10/021-mtd-bcm47xxpart-detect-block-aligned-Squashfs-partit.patch (renamed from target/linux/brcm47xx/patches-3.10/029-mtd-bcm47xxpart_detect_block_aligned_Squashfs_partition.patch)16
-rw-r--r--target/linux/brcm47xx/patches-3.10/022-mtd-bcm47xxpart-detect-factory-partition.patch (renamed from target/linux/brcm47xx/patches-3.10/030-mtd-bcm47xxpart_detect_factory_partition.patch)18
-rw-r--r--target/linux/brcm47xx/patches-3.10/023-mtd-bcm47xxpart-find-boot-partition-by-CFE-magic.patch43
-rw-r--r--target/linux/brcm47xx/patches-3.10/024-mtd-bcm47xxpart-alternative-MAGIC-for-board_data-par.patch52
-rw-r--r--target/linux/brcm47xx/patches-3.10/026-mtd-bcm47xxpart-find-boot-partition-by-CFE-magic.patch26
-rw-r--r--target/linux/brcm47xx/patches-3.10/027-mtd-bcm47xxpart-get-nvram.patch4
7 files changed, 154 insertions, 35 deletions
diff --git a/target/linux/brcm47xx/patches-3.10/020-mtd-bcm47xxpart-handle-malloc-failures.patch b/target/linux/brcm47xx/patches-3.10/020-mtd-bcm47xxpart-handle-malloc-failures.patch
new file mode 100644
index 0000000000..ad24b5993d
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.10/020-mtd-bcm47xxpart-handle-malloc-failures.patch
@@ -0,0 +1,30 @@
+From 99b1d1887fee36ef9ff5d2ee24f0cf3e8c172104 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Sun, 13 Oct 2013 22:53:49 +0200
+Subject: [PATCH] mtd: bcm47xxpart: handle malloc failures
+
+Handle return NULL in malloc.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -71,7 +71,14 @@ static int bcm47xxpart_parse(struct mtd_
+ /* Alloc */
+ parts = kzalloc(sizeof(struct mtd_partition) * BCM47XXPART_MAX_PARTS,
+ GFP_KERNEL);
++ if (!parts)
++ return -ENOMEM;
++
+ buf = kzalloc(BCM47XXPART_BYTES_TO_READ, GFP_KERNEL);
++ if (!buf) {
++ kfree(parts);
++ return -ENOMEM;
++ }
+
+ /* Parse block by block looking for magics */
+ for (offset = 0; offset <= master->size - blocksize;
diff --git a/target/linux/brcm47xx/patches-3.10/029-mtd-bcm47xxpart_detect_block_aligned_Squashfs_partition.patch b/target/linux/brcm47xx/patches-3.10/021-mtd-bcm47xxpart-detect-block-aligned-Squashfs-partit.patch
index 0efe16f9d4..72891b2c6a 100644
--- a/target/linux/brcm47xx/patches-3.10/029-mtd-bcm47xxpart_detect_block_aligned_Squashfs_partition.patch
+++ b/target/linux/brcm47xx/patches-3.10/021-mtd-bcm47xxpart-detect-block-aligned-Squashfs-partit.patch
@@ -1,4 +1,10 @@
-mtd: bcm47xxpart: detect block aligned Squashfs partition
+From 020c6bcfbeabee72c18d862769d72cf9241b9004 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Mon, 21 Oct 2013 22:34:37 +0200
+Subject: [PATCH] mtd: bcm47xxpart: detect block aligned Squashfs partition
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
Most of the bcm47xx devices use TRX format for storing kernel and some
partition like Squashfs or JFFS2. This is pretty flexible solution, CFE
@@ -13,10 +19,14 @@ This patch allows Linux find a rootfs partition after installing custom
image with a CFE bootloader.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
--- a/drivers/mtd/bcm47xxpart.c
+++ b/drivers/mtd/bcm47xxpart.c
-@@ -33,6 +33,7 @@
+@@ -32,6 +32,7 @@
#define ML_MAGIC1 0x39685a42
#define ML_MAGIC2 0x26594131
#define TRX_MAGIC 0x30524448
@@ -24,7 +34,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
struct trx_header {
uint32_t magic;
-@@ -170,6 +171,13 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -174,6 +175,13 @@ static int bcm47xxpart_parse(struct mtd_
offset = rounddown(offset + trx->length, blocksize);
continue;
}
diff --git a/target/linux/brcm47xx/patches-3.10/030-mtd-bcm47xxpart_detect_factory_partition.patch b/target/linux/brcm47xx/patches-3.10/022-mtd-bcm47xxpart-detect-factory-partition.patch
index 6630700e87..389976cb85 100644
--- a/target/linux/brcm47xx/patches-3.10/030-mtd-bcm47xxpart_detect_factory_partition.patch
+++ b/target/linux/brcm47xx/patches-3.10/022-mtd-bcm47xxpart-detect-factory-partition.patch
@@ -1,21 +1,31 @@
-mtd: bcm47xxpart: detect "factory" partition
+From 33094c736cd36a6cecadae6bce4daba89dabc326 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Mon, 21 Oct 2013 22:35:34 +0200
+Subject: [PATCH] mtd: bcm47xxpart: detect "factory" partition
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
A new type of partition with magic FCTY was found on Huawei E970:
46 43 54 59 4b 51 37 4e 41 42 31 38 41 32 39 30 |FCTYKQ7NAB18A290|
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
--- a/drivers/mtd/bcm47xxpart.c
+++ b/drivers/mtd/bcm47xxpart.c
-@@ -28,6 +28,7 @@
+@@ -27,6 +27,7 @@
+
/* Magics */
- #define CFE_MAGIC 0x43464531 /* 1EFC */
#define BOARD_DATA_MAGIC 0x5246504D /* MPFR */
+#define FACTORY_MAGIC 0x59544346 /* FCTY */
#define POT_MAGIC1 0x54544f50 /* POTT */
#define POT_MAGIC2 0x504f /* OP */
#define ML_MAGIC1 0x39685a42
-@@ -113,6 +114,13 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -117,6 +118,13 @@ static int bcm47xxpart_parse(struct mtd_
offset, MTD_WRITEABLE);
continue;
}
diff --git a/target/linux/brcm47xx/patches-3.10/023-mtd-bcm47xxpart-find-boot-partition-by-CFE-magic.patch b/target/linux/brcm47xx/patches-3.10/023-mtd-bcm47xxpart-find-boot-partition-by-CFE-magic.patch
new file mode 100644
index 0000000000..599114bf52
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.10/023-mtd-bcm47xxpart-find-boot-partition-by-CFE-magic.patch
@@ -0,0 +1,43 @@
+From 4f8aaf72287578c846ed7ac8c6114aacbf416e45 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sat, 21 Dec 2013 19:39:11 +0100
+Subject: [PATCH] mtd: bcm47xxpart: find boot partition by CFE magic
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Some devices have even nicer-to-recognize CFE thanks to the magic.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -23,10 +23,11 @@
+ * Amount of bytes we read when analyzing each block of flash memory.
+ * Set it big enough to allow detecting partition and reading important data.
+ */
+-#define BCM47XXPART_BYTES_TO_READ 0x404
++#define BCM47XXPART_BYTES_TO_READ 0x4e8
+
+ /* Magics */
+ #define BOARD_DATA_MAGIC 0x5246504D /* MPFR */
++#define CFE_MAGIC 0x43464531 /* 1EFC */
+ #define FACTORY_MAGIC 0x59544346 /* FCTY */
+ #define POT_MAGIC1 0x54544f50 /* POTT */
+ #define POT_MAGIC2 0x504f /* OP */
+@@ -102,8 +103,9 @@ static int bcm47xxpart_parse(struct mtd_
+ continue;
+ }
+
+- /* CFE has small NVRAM at 0x400 */
+- if (buf[0x400 / 4] == NVRAM_HEADER) {
++ /* Magic or small NVRAM at 0x400 */
++ if ((buf[0x4e0 / 4] == CFE_MAGIC && buf[0x4e4 / 4] == CFE_MAGIC) ||
++ (buf[0x400 / 4] == NVRAM_HEADER)) {
+ bcm47xxpart_add_part(&parts[curr_part++], "boot",
+ offset, MTD_WRITEABLE);
+ continue;
diff --git a/target/linux/brcm47xx/patches-3.10/024-mtd-bcm47xxpart-alternative-MAGIC-for-board_data-par.patch b/target/linux/brcm47xx/patches-3.10/024-mtd-bcm47xxpart-alternative-MAGIC-for-board_data-par.patch
new file mode 100644
index 0000000000..5f9a5b9078
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.10/024-mtd-bcm47xxpart-alternative-MAGIC-for-board_data-par.patch
@@ -0,0 +1,52 @@
+From f0501e81fbaa51cfc8c28c60bc3fc7965fde94f4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sat, 21 Dec 2013 19:39:12 +0100
+Subject: [PATCH] mtd: bcm47xxpart: alternative MAGIC for board_data partition
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Some devices (like WNDR3700v3) have board_data without MPFR magic, some
+extra header or extra NVRAM around 0x100. In such case we have to look
+for another magic which is BD 0B 0D BD (BD probably stands for Board
+Data). It's located "far far away", so instead of extending buffer add
+another mtd_read.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+--- a/drivers/mtd/bcm47xxpart.c
++++ b/drivers/mtd/bcm47xxpart.c
+@@ -27,6 +27,7 @@
+
+ /* Magics */
+ #define BOARD_DATA_MAGIC 0x5246504D /* MPFR */
++#define BOARD_DATA_MAGIC2 0xBD0D0BBD
+ #define CFE_MAGIC 0x43464531 /* 1EFC */
+ #define FACTORY_MAGIC 0x59544346 /* FCTY */
+ #define POT_MAGIC1 0x54544f50 /* POTT */
+@@ -192,6 +193,21 @@ static int bcm47xxpart_parse(struct mtd_
+ offset, 0);
+ continue;
+ }
++
++ /* 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);
++ continue;
++ }
++
++ /* Some devices (ex. WNDR3700v3) don't have a standard 'MPFR' */
++ if (buf[0x000 / 4] == BOARD_DATA_MAGIC2) {
++ bcm47xxpart_add_part(&parts[curr_part++], "board_data",
++ offset, MTD_WRITEABLE);
++ continue;
++ }
+ }
+
+ /* Look for NVRAM at the end of the last block. */
diff --git a/target/linux/brcm47xx/patches-3.10/026-mtd-bcm47xxpart-find-boot-partition-by-CFE-magic.patch b/target/linux/brcm47xx/patches-3.10/026-mtd-bcm47xxpart-find-boot-partition-by-CFE-magic.patch
deleted file mode 100644
index d3fb9d3a66..0000000000
--- a/target/linux/brcm47xx/patches-3.10/026-mtd-bcm47xxpart-find-boot-partition-by-CFE-magic.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -23,9 +23,10 @@
- * Amount of bytes we read when analyzing each block of flash memory.
- * Set it big enough to allow detecting partition and reading important data.
- */
--#define BCM47XXPART_BYTES_TO_READ 0x404
-+#define BCM47XXPART_BYTES_TO_READ 0x4e8
-
- /* Magics */
-+#define CFE_MAGIC 0x43464531 /* 1EFC */
- #define BOARD_DATA_MAGIC 0x5246504D /* MPFR */
- #define POT_MAGIC1 0x54544f50 /* POTT */
- #define POT_MAGIC2 0x504f /* OP */
-@@ -93,8 +94,9 @@ static int bcm47xxpart_parse(struct mtd_
- continue;
- }
-
-- /* CFE has small NVRAM at 0x400 */
-- if (buf[0x400 / 4] == NVRAM_HEADER) {
-+ /* Magic or small NVRAM at 0x400 */
-+ if (buf[0x4e0 / 4] == CFE_MAGIC ||
-+ buf[0x400 / 4] == NVRAM_HEADER) {
- bcm47xxpart_add_part(&parts[curr_part++], "boot",
- offset, MTD_WRITEABLE);
- continue;
diff --git a/target/linux/brcm47xx/patches-3.10/027-mtd-bcm47xxpart-get-nvram.patch b/target/linux/brcm47xx/patches-3.10/027-mtd-bcm47xxpart-get-nvram.patch
index 4cd78c2011..086d7b3a4d 100644
--- a/target/linux/brcm47xx/patches-3.10/027-mtd-bcm47xxpart-get-nvram.patch
+++ b/target/linux/brcm47xx/patches-3.10/027-mtd-bcm47xxpart-get-nvram.patch
@@ -1,6 +1,6 @@
--- a/drivers/mtd/bcm47xxpart.c
+++ b/drivers/mtd/bcm47xxpart.c
-@@ -65,6 +65,7 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -68,6 +68,7 @@ static int bcm47xxpart_parse(struct mtd_
int trx_part = -1;
int last_trx_part = -1;
int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
@@ -8,7 +8,7 @@
if (blocksize <= 0x10000)
blocksize = 0x10000;
-@@ -190,12 +191,23 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -229,12 +230,23 @@ static int bcm47xxpart_parse(struct mtd_
if (buf[0] == NVRAM_HEADER) {
bcm47xxpart_add_part(&parts[curr_part++], "nvram",
master->size - blocksize, 0);