From 66a5779c02ac9d156ed932b3456a3a4e67df722d Mon Sep 17 00:00:00 2001 From: rmilecki Date: Tue, 27 Jan 2015 22:08:14 +0000 Subject: [PATCH] kernel: backport queued bcm47xxpart changes MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafał Miłecki git-svn-id: svn://svn.openwrt.org/openwrt/trunk@44156 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- ...part-lower-minimal-blocksize-to-4Ki-from-.patch | 38 --------- ...part-lower-minimal-blocksize-to-4Ki-from-.patch | 38 --------- .../051-mtd-bcm47xxpart-backports-from-3.20.patch | 95 ++++++++++++++++++++++ ...part-support-TRX-data-partition-being-UBI.patch | 66 --------------- .../041-mtd-bcm47xxpart-backports-from-3.20.patch | 95 ++++++++++++++++++++++ ...part-support-TRX-data-partition-being-UBI.patch | 66 --------------- 6 files changed, 190 insertions(+), 208 deletions(-) delete mode 100644 target/linux/brcm47xx/patches-3.14/400-mtd-bcm47xxpart-lower-minimal-blocksize-to-4Ki-from-.patch delete mode 100644 target/linux/brcm47xx/patches-3.18/400-mtd-bcm47xxpart-lower-minimal-blocksize-to-4Ki-from-.patch create mode 100644 target/linux/generic/patches-3.14/051-mtd-bcm47xxpart-backports-from-3.20.patch delete mode 100644 target/linux/generic/patches-3.14/431-mtd-bcm47xxpart-support-TRX-data-partition-being-UBI.patch create mode 100644 target/linux/generic/patches-3.18/041-mtd-bcm47xxpart-backports-from-3.20.patch delete mode 100644 target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-support-TRX-data-partition-being-UBI.patch diff --git a/target/linux/brcm47xx/patches-3.14/400-mtd-bcm47xxpart-lower-minimal-blocksize-to-4Ki-from-.patch b/target/linux/brcm47xx/patches-3.14/400-mtd-bcm47xxpart-lower-minimal-blocksize-to-4Ki-from-.patch deleted file mode 100644 index 6f7cdb6ef2..0000000000 --- a/target/linux/brcm47xx/patches-3.14/400-mtd-bcm47xxpart-lower-minimal-blocksize-to-4Ki-from-.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 4586bc54a322568d5258d6a1b04e361d4a95597b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Wed, 12 Nov 2014 09:06:22 +0100 -Subject: [PATCH][RFC] mtd: bcm47xxpart: lower minimal blocksize to 4Ki (from - 64Ki) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Some devices like Netgear WNR1000v3 or WGR614v10 have partitions aligned -to 0x1000. Using bigger blocksize stopped us from detecting some parts. - -Signed-off-by: Rafał Miłecki ---- -Most of supported devices use flashes with erasesize 0x10000 (64Ki), so -this change shouldn't affect them (no regressions expected). -Any objections? ---- - drivers/mtd/bcm47xxpart.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - ---- a/drivers/mtd/bcm47xxpart.c -+++ b/drivers/mtd/bcm47xxpart.c -@@ -95,8 +95,12 @@ static int bcm47xxpart_parse(struct mtd_ - int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; - bool found_nvram = false; - -- if (blocksize <= 0x10000) -- blocksize = 0x10000; -+ /* -+ * Some really old flashes (like AT45DB*) had smaller erasesize-s, but -+ * partitions were aligned to at least 0x1000 anyway. -+ */ -+ if (blocksize < 0x1000) -+ blocksize = 0x1000; - - /* Alloc */ - parts = kzalloc(sizeof(struct mtd_partition) * BCM47XXPART_MAX_PARTS, diff --git a/target/linux/brcm47xx/patches-3.18/400-mtd-bcm47xxpart-lower-minimal-blocksize-to-4Ki-from-.patch b/target/linux/brcm47xx/patches-3.18/400-mtd-bcm47xxpart-lower-minimal-blocksize-to-4Ki-from-.patch deleted file mode 100644 index 6f7cdb6ef2..0000000000 --- a/target/linux/brcm47xx/patches-3.18/400-mtd-bcm47xxpart-lower-minimal-blocksize-to-4Ki-from-.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 4586bc54a322568d5258d6a1b04e361d4a95597b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Wed, 12 Nov 2014 09:06:22 +0100 -Subject: [PATCH][RFC] mtd: bcm47xxpart: lower minimal blocksize to 4Ki (from - 64Ki) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Some devices like Netgear WNR1000v3 or WGR614v10 have partitions aligned -to 0x1000. Using bigger blocksize stopped us from detecting some parts. - -Signed-off-by: Rafał Miłecki ---- -Most of supported devices use flashes with erasesize 0x10000 (64Ki), so -this change shouldn't affect them (no regressions expected). -Any objections? ---- - drivers/mtd/bcm47xxpart.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - ---- a/drivers/mtd/bcm47xxpart.c -+++ b/drivers/mtd/bcm47xxpart.c -@@ -95,8 +95,12 @@ static int bcm47xxpart_parse(struct mtd_ - int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; - bool found_nvram = false; - -- if (blocksize <= 0x10000) -- blocksize = 0x10000; -+ /* -+ * Some really old flashes (like AT45DB*) had smaller erasesize-s, but -+ * partitions were aligned to at least 0x1000 anyway. -+ */ -+ if (blocksize < 0x1000) -+ blocksize = 0x1000; - - /* Alloc */ - parts = kzalloc(sizeof(struct mtd_partition) * BCM47XXPART_MAX_PARTS, diff --git a/target/linux/generic/patches-3.14/051-mtd-bcm47xxpart-backports-from-3.20.patch b/target/linux/generic/patches-3.14/051-mtd-bcm47xxpart-backports-from-3.20.patch new file mode 100644 index 0000000000..59180c2084 --- /dev/null +++ b/target/linux/generic/patches-3.14/051-mtd-bcm47xxpart-backports-from-3.20.patch @@ -0,0 +1,95 @@ +--- a/drivers/mtd/bcm47xxpart.c ++++ b/drivers/mtd/bcm47xxpart.c +@@ -15,6 +15,8 @@ + #include + #include + ++#include ++ + /* + * NAND flash on Netgear R6250 was verified to contain 15 partitions. + * This will result in allocating too big array for some old devices, but the +@@ -39,7 +41,8 @@ + #define ML_MAGIC1 0x39685a42 + #define ML_MAGIC2 0x26594131 + #define TRX_MAGIC 0x30524448 +-#define SQSH_MAGIC 0x71736873 /* shsq */ ++#define SHSQ_MAGIC 0x71736873 /* shsq (weird ZTE H218N endianness) */ ++#define UBI_EC_MAGIC 0x23494255 /* UBI# */ + + struct trx_header { + uint32_t magic; +@@ -50,7 +53,7 @@ struct trx_header { + uint32_t offset[3]; + } __packed; + +-static void bcm47xxpart_add_part(struct mtd_partition *part, char *name, ++static void bcm47xxpart_add_part(struct mtd_partition *part, const char *name, + u64 offset, uint32_t mask_flags) + { + part->name = name; +@@ -58,6 +61,26 @@ static void bcm47xxpart_add_part(struct + part->mask_flags = mask_flags; + } + ++static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master, ++ size_t offset) ++{ ++ uint32_t buf; ++ size_t bytes_read; ++ ++ 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); ++ goto out_default; ++ } ++ ++ if (buf == UBI_EC_MAGIC) ++ return "ubi"; ++ ++out_default: ++ return "rootfs"; ++} ++ + static int bcm47xxpart_parse(struct mtd_info *master, + struct mtd_partition **pparts, + struct mtd_part_parser_data *data) +@@ -73,8 +96,12 @@ static int bcm47xxpart_parse(struct mtd_ + int last_trx_part = -1; + int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; + +- if (blocksize <= 0x10000) +- blocksize = 0x10000; ++ /* ++ * Some really old flashes (like AT45DB*) had smaller erasesize-s, but ++ * partitions were aligned to at least 0x1000 anyway. ++ */ ++ if (blocksize < 0x1000) ++ blocksize = 0x1000; + + /* Alloc */ + parts = kzalloc(sizeof(struct mtd_partition) * BCM47XXPART_MAX_PARTS, +@@ -186,8 +213,11 @@ static int bcm47xxpart_parse(struct mtd_ + * we want to have jffs2 (overlay) in the same mtd. + */ + if (trx->offset[i]) { ++ const char *name; ++ ++ name = bcm47xxpart_trx_data_part_name(master, offset + trx->offset[i]); + bcm47xxpart_add_part(&parts[curr_part++], +- "rootfs", ++ name, + offset + trx->offset[i], + 0); + i++; +@@ -205,7 +235,8 @@ static int bcm47xxpart_parse(struct mtd_ + } + + /* Squashfs on devices not using TRX */ +- if (buf[0x000 / 4] == SQSH_MAGIC) { ++ if (le32_to_cpu(buf[0x000 / 4]) == SQUASHFS_MAGIC || ++ buf[0x000 / 4] == SHSQ_MAGIC) { + bcm47xxpart_add_part(&parts[curr_part++], "rootfs", + offset, 0); + continue; diff --git a/target/linux/generic/patches-3.14/431-mtd-bcm47xxpart-support-TRX-data-partition-being-UBI.patch b/target/linux/generic/patches-3.14/431-mtd-bcm47xxpart-support-TRX-data-partition-being-UBI.patch deleted file mode 100644 index 4c4720341e..0000000000 --- a/target/linux/generic/patches-3.14/431-mtd-bcm47xxpart-support-TRX-data-partition-being-UBI.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- a/drivers/mtd/bcm47xxpart.c -+++ b/drivers/mtd/bcm47xxpart.c -@@ -40,6 +40,7 @@ - #define ML_MAGIC2 0x26594131 - #define TRX_MAGIC 0x30524448 - #define SQSH_MAGIC 0x71736873 /* shsq */ -+#define UBI_EC_MAGIC 0x23494255 /* UBI# */ - - struct trx_header { - uint32_t magic; -@@ -50,7 +51,7 @@ struct trx_header { - uint32_t offset[3]; - } __packed; - --static void bcm47xxpart_add_part(struct mtd_partition *part, char *name, -+static void bcm47xxpart_add_part(struct mtd_partition *part, const char *name, - u64 offset, uint32_t mask_flags) - { - part->name = name; -@@ -58,6 +59,26 @@ static void bcm47xxpart_add_part(struct - part->mask_flags = mask_flags; - } - -+static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master, -+ size_t offset) -+{ -+ uint32_t buf; -+ size_t bytes_read; -+ -+ 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); -+ goto out_default; -+ } -+ -+ if (buf == UBI_EC_MAGIC) -+ return "ubi"; -+ -+out_default: -+ return "rootfs"; -+} -+ - static int bcm47xxpart_parse(struct mtd_info *master, - struct mtd_partition **pparts, - struct mtd_part_parser_data *data) -@@ -151,6 +172,8 @@ static int bcm47xxpart_parse(struct mtd_ - - /* TRX */ - if (buf[0x000 / 4] == TRX_MAGIC) { -+ const char *name; -+ - if (BCM47XXPART_MAX_PARTS - curr_part < 4) { - pr_warn("Not enough partitions left to register trx, scanning stopped!\n"); - break; -@@ -186,8 +209,9 @@ static int bcm47xxpart_parse(struct mtd_ - * we want to have jffs2 (overlay) in the same mtd. - */ - if (trx->offset[i]) { -+ name = bcm47xxpart_trx_data_part_name(master, offset + trx->offset[i]); - bcm47xxpart_add_part(&parts[curr_part++], -- "rootfs", -+ name, - offset + trx->offset[i], - 0); - i++; diff --git a/target/linux/generic/patches-3.18/041-mtd-bcm47xxpart-backports-from-3.20.patch b/target/linux/generic/patches-3.18/041-mtd-bcm47xxpart-backports-from-3.20.patch new file mode 100644 index 0000000000..59180c2084 --- /dev/null +++ b/target/linux/generic/patches-3.18/041-mtd-bcm47xxpart-backports-from-3.20.patch @@ -0,0 +1,95 @@ +--- a/drivers/mtd/bcm47xxpart.c ++++ b/drivers/mtd/bcm47xxpart.c +@@ -15,6 +15,8 @@ + #include + #include + ++#include ++ + /* + * NAND flash on Netgear R6250 was verified to contain 15 partitions. + * This will result in allocating too big array for some old devices, but the +@@ -39,7 +41,8 @@ + #define ML_MAGIC1 0x39685a42 + #define ML_MAGIC2 0x26594131 + #define TRX_MAGIC 0x30524448 +-#define SQSH_MAGIC 0x71736873 /* shsq */ ++#define SHSQ_MAGIC 0x71736873 /* shsq (weird ZTE H218N endianness) */ ++#define UBI_EC_MAGIC 0x23494255 /* UBI# */ + + struct trx_header { + uint32_t magic; +@@ -50,7 +53,7 @@ struct trx_header { + uint32_t offset[3]; + } __packed; + +-static void bcm47xxpart_add_part(struct mtd_partition *part, char *name, ++static void bcm47xxpart_add_part(struct mtd_partition *part, const char *name, + u64 offset, uint32_t mask_flags) + { + part->name = name; +@@ -58,6 +61,26 @@ static void bcm47xxpart_add_part(struct + part->mask_flags = mask_flags; + } + ++static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master, ++ size_t offset) ++{ ++ uint32_t buf; ++ size_t bytes_read; ++ ++ 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); ++ goto out_default; ++ } ++ ++ if (buf == UBI_EC_MAGIC) ++ return "ubi"; ++ ++out_default: ++ return "rootfs"; ++} ++ + static int bcm47xxpart_parse(struct mtd_info *master, + struct mtd_partition **pparts, + struct mtd_part_parser_data *data) +@@ -73,8 +96,12 @@ static int bcm47xxpart_parse(struct mtd_ + int last_trx_part = -1; + int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; + +- if (blocksize <= 0x10000) +- blocksize = 0x10000; ++ /* ++ * Some really old flashes (like AT45DB*) had smaller erasesize-s, but ++ * partitions were aligned to at least 0x1000 anyway. ++ */ ++ if (blocksize < 0x1000) ++ blocksize = 0x1000; + + /* Alloc */ + parts = kzalloc(sizeof(struct mtd_partition) * BCM47XXPART_MAX_PARTS, +@@ -186,8 +213,11 @@ static int bcm47xxpart_parse(struct mtd_ + * we want to have jffs2 (overlay) in the same mtd. + */ + if (trx->offset[i]) { ++ const char *name; ++ ++ name = bcm47xxpart_trx_data_part_name(master, offset + trx->offset[i]); + bcm47xxpart_add_part(&parts[curr_part++], +- "rootfs", ++ name, + offset + trx->offset[i], + 0); + i++; +@@ -205,7 +235,8 @@ static int bcm47xxpart_parse(struct mtd_ + } + + /* Squashfs on devices not using TRX */ +- if (buf[0x000 / 4] == SQSH_MAGIC) { ++ if (le32_to_cpu(buf[0x000 / 4]) == SQUASHFS_MAGIC || ++ buf[0x000 / 4] == SHSQ_MAGIC) { + bcm47xxpart_add_part(&parts[curr_part++], "rootfs", + offset, 0); + continue; diff --git a/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-support-TRX-data-partition-being-UBI.patch b/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-support-TRX-data-partition-being-UBI.patch deleted file mode 100644 index 4c4720341e..0000000000 --- a/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-support-TRX-data-partition-being-UBI.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- a/drivers/mtd/bcm47xxpart.c -+++ b/drivers/mtd/bcm47xxpart.c -@@ -40,6 +40,7 @@ - #define ML_MAGIC2 0x26594131 - #define TRX_MAGIC 0x30524448 - #define SQSH_MAGIC 0x71736873 /* shsq */ -+#define UBI_EC_MAGIC 0x23494255 /* UBI# */ - - struct trx_header { - uint32_t magic; -@@ -50,7 +51,7 @@ struct trx_header { - uint32_t offset[3]; - } __packed; - --static void bcm47xxpart_add_part(struct mtd_partition *part, char *name, -+static void bcm47xxpart_add_part(struct mtd_partition *part, const char *name, - u64 offset, uint32_t mask_flags) - { - part->name = name; -@@ -58,6 +59,26 @@ static void bcm47xxpart_add_part(struct - part->mask_flags = mask_flags; - } - -+static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master, -+ size_t offset) -+{ -+ uint32_t buf; -+ size_t bytes_read; -+ -+ 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); -+ goto out_default; -+ } -+ -+ if (buf == UBI_EC_MAGIC) -+ return "ubi"; -+ -+out_default: -+ return "rootfs"; -+} -+ - static int bcm47xxpart_parse(struct mtd_info *master, - struct mtd_partition **pparts, - struct mtd_part_parser_data *data) -@@ -151,6 +172,8 @@ static int bcm47xxpart_parse(struct mtd_ - - /* TRX */ - if (buf[0x000 / 4] == TRX_MAGIC) { -+ const char *name; -+ - if (BCM47XXPART_MAX_PARTS - curr_part < 4) { - pr_warn("Not enough partitions left to register trx, scanning stopped!\n"); - break; -@@ -186,8 +209,9 @@ static int bcm47xxpart_parse(struct mtd_ - * we want to have jffs2 (overlay) in the same mtd. - */ - if (trx->offset[i]) { -+ name = bcm47xxpart_trx_data_part_name(master, offset + trx->offset[i]); - bcm47xxpart_add_part(&parts[curr_part++], -- "rootfs", -+ name, - offset + trx->offset[i], - 0); - i++; -- 2.11.0