From 1f4e5f77a0d5bc3cce01c501409ccfdce08b0382 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Sun, 19 May 2013 18:32:02 +0000 Subject: [PATCH] bcm63xx: Simplify CFE detection. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check bootloader argument in mtd. Signed-off-by: Álvaro Fernández Rojas [jogo@openwrt.org: split into two patches, one for detection, one letting bcm63xxpart use it.] Signed-off-by: Jonas Gorski SVN-Revision: 36659 --- .../patches-3.8/309-cfe_version_mod.patch | 15 ------ .../323-cfe_simplify_detection.patch | 20 ++++++++ .../324-bcm63xxpart_use_cfedetection.patch | 51 +++++++++++++++++++ .../401-bcm963xx_real_rootfs_length.patch | 2 +- ...xpart-allow-passing-a-caldata-offset.patch | 10 ++-- .../patches-3.8/534-board_hw556.patch | 2 +- 6 files changed, 78 insertions(+), 22 deletions(-) create mode 100644 target/linux/brcm63xx/patches-3.8/323-cfe_simplify_detection.patch create mode 100644 target/linux/brcm63xx/patches-3.8/324-bcm63xxpart_use_cfedetection.patch diff --git a/target/linux/brcm63xx/patches-3.8/309-cfe_version_mod.patch b/target/linux/brcm63xx/patches-3.8/309-cfe_version_mod.patch index f350d21ac4..9482b6b56f 100644 --- a/target/linux/brcm63xx/patches-3.8/309-cfe_version_mod.patch +++ b/target/linux/brcm63xx/patches-3.8/309-cfe_version_mod.patch @@ -9,18 +9,3 @@ else strcpy(cfe_version, "unknown"); printk(KERN_INFO PFX "CFE version: %s\n", cfe_version); ---- a/drivers/mtd/bcm63xxpart.c -+++ b/drivers/mtd/bcm63xxpart.c -@@ -56,10 +56,10 @@ static int bcm63xx_detect_cfe(struct mtd - if (ret) - return ret; - -- if (strncmp("cfe-v", buf, 5) == 0) -+ if (strncmp("cfe-", buf, 4) == 0) - return 0; - -- /* very old CFE's do not have the cfe-v string, so check for magic */ -+ /* very old CFE's do not have the cfe- string, so check for magic */ - ret = mtd_read(master, BCM63XX_CFE_MAGIC_OFFSET, 8, &retlen, - (void *)buf); - buf[retlen] = 0; diff --git a/target/linux/brcm63xx/patches-3.8/323-cfe_simplify_detection.patch b/target/linux/brcm63xx/patches-3.8/323-cfe_simplify_detection.patch new file mode 100644 index 0000000000..e05c91d931 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.8/323-cfe_simplify_detection.patch @@ -0,0 +1,20 @@ +--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h ++++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h +@@ -1,6 +1,8 @@ + #ifndef BCM63XX_BOARD_H_ + #define BCM63XX_BOARD_H_ + ++#include ++ + const char *board_get_name(void); + + void board_prom_init(void); +@@ -9,4 +11,8 @@ void board_setup(void); + + int board_register_devices(void); + ++static inline bool bcm63xx_is_cfe_present(void) { ++ return fw_arg3 == 0x43464531; ++} ++ + #endif /* ! BCM63XX_BOARD_H_ */ diff --git a/target/linux/brcm63xx/patches-3.8/324-bcm63xxpart_use_cfedetection.patch b/target/linux/brcm63xx/patches-3.8/324-bcm63xxpart_use_cfedetection.patch new file mode 100644 index 0000000000..fd7d08a3db --- /dev/null +++ b/target/linux/brcm63xx/patches-3.8/324-bcm63xxpart_use_cfedetection.patch @@ -0,0 +1,51 @@ +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -35,7 +35,7 @@ + + #include + #include +-#include ++#include + + #define BCM63XX_EXTENDED_SIZE 0xBFC00000 /* Extended flash address */ + +@@ -43,30 +43,6 @@ + + #define BCM63XX_CFE_MAGIC_OFFSET 0x4e0 + +-static int bcm63xx_detect_cfe(struct mtd_info *master) +-{ +- char buf[9]; +- int ret; +- size_t retlen; +- +- ret = mtd_read(master, BCM963XX_CFE_VERSION_OFFSET, 5, &retlen, +- (void *)buf); +- buf[retlen] = 0; +- +- if (ret) +- return ret; +- +- if (strncmp("cfe-v", buf, 5) == 0) +- return 0; +- +- /* very old CFE's do not have the cfe-v string, so check for magic */ +- ret = mtd_read(master, BCM63XX_CFE_MAGIC_OFFSET, 8, &retlen, +- (void *)buf); +- buf[retlen] = 0; +- +- return strncmp("CFE1CFE1", buf, 8); +-} +- + static int bcm63xx_parse_cfe_partitions(struct mtd_info *master, + struct mtd_partition **pparts, + struct mtd_part_parser_data *data) +@@ -85,7 +61,7 @@ static int bcm63xx_parse_cfe_partitions( + u32 computed_crc; + bool rootfs_first = false; + +- if (bcm63xx_detect_cfe(master)) ++ if (!bcm63xx_is_cfe_present()) + return -EINVAL; + + cfe_erasesize = max_t(uint32_t, master->erasesize, diff --git a/target/linux/brcm63xx/patches-3.8/401-bcm963xx_real_rootfs_length.patch b/target/linux/brcm63xx/patches-3.8/401-bcm963xx_real_rootfs_length.patch index e5d0208659..caf8b9514d 100644 --- a/target/linux/brcm63xx/patches-3.8/401-bcm963xx_real_rootfs_length.patch +++ b/target/linux/brcm63xx/patches-3.8/401-bcm963xx_real_rootfs_length.patch @@ -15,7 +15,7 @@ /* 240-255: Unused at present */ --- a/drivers/mtd/bcm63xxpart.c +++ b/drivers/mtd/bcm63xxpart.c -@@ -134,7 +134,8 @@ static int bcm63xx_parse_cfe_partitions( +@@ -110,7 +110,8 @@ static int bcm63xx_parse_cfe_partitions( } else { /* OpenWrt layout */ rootfsaddr = kerneladdr + kernellen; diff --git a/target/linux/brcm63xx/patches-3.8/417-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch b/target/linux/brcm63xx/patches-3.8/417-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch index d33f899194..5ce822339f 100644 --- a/target/linux/brcm63xx/patches-3.8/417-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch +++ b/target/linux/brcm63xx/patches-3.8/417-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch @@ -7,7 +7,7 @@ contained in flash. --- a/drivers/mtd/bcm63xxpart.c +++ b/drivers/mtd/bcm63xxpart.c -@@ -77,10 +77,12 @@ static int bcm63xx_parse_cfe_partitions( +@@ -53,10 +53,12 @@ static int bcm63xx_parse_cfe_partitions( struct mtd_partition *parts; int ret; size_t retlen; @@ -21,7 +21,7 @@ contained in flash. int i; u32 computed_crc; bool rootfs_first = false; -@@ -94,6 +96,24 @@ static int bcm63xx_parse_cfe_partitions( +@@ -70,6 +72,24 @@ static int bcm63xx_parse_cfe_partitions( cfelen = cfe_erasesize; nvramlen = bcm63xx_nvram_get_psi_size(); nvramlen = roundup(nvramlen, cfe_erasesize); @@ -46,7 +46,7 @@ contained in flash. /* Allocate memory for buffer */ buf = vmalloc(sizeof(struct bcm_tag)); -@@ -145,7 +165,7 @@ static int bcm63xx_parse_cfe_partitions( +@@ -121,7 +141,7 @@ static int bcm63xx_parse_cfe_partitions( rootfsaddr = 0; spareaddr = cfelen; } @@ -55,7 +55,7 @@ contained in flash. /* Determine number of partitions */ if (rootfslen > 0) -@@ -154,6 +174,12 @@ static int bcm63xx_parse_cfe_partitions( +@@ -130,6 +150,12 @@ static int bcm63xx_parse_cfe_partitions( if (kernellen > 0) nrparts++; @@ -68,7 +68,7 @@ contained in flash. /* Ask kernel for more memory */ parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL); if (!parts) { -@@ -191,15 +217,32 @@ static int bcm63xx_parse_cfe_partitions( +@@ -167,15 +193,32 @@ static int bcm63xx_parse_cfe_partitions( curpart++; } diff --git a/target/linux/brcm63xx/patches-3.8/534-board_hw556.patch b/target/linux/brcm63xx/patches-3.8/534-board_hw556.patch index e0a1542ad4..fb0afa4493 100644 --- a/target/linux/brcm63xx/patches-3.8/534-board_hw556.patch +++ b/target/linux/brcm63xx/patches-3.8/534-board_hw556.patch @@ -433,7 +433,7 @@ --- a/drivers/mtd/bcm63xxpart.c +++ b/drivers/mtd/bcm63xxpart.c -@@ -94,6 +94,11 @@ static int bcm63xx_parse_cfe_partitions( +@@ -70,6 +70,11 @@ static int bcm63xx_parse_cfe_partitions( BCM63XX_CFE_BLOCK_SIZE); cfelen = cfe_erasesize;