bcm63xx: Simplify CFE detection.

Check bootloader argument in mtd.

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
[jogo@openwrt.org: split into two patches, one for detection,
                   one letting bcm63xxpart use it.]
Signed-off-by: Jonas Gorski <jogo@openwrt.org>

SVN-Revision: 36659
owl
Jonas Gorski 2013-05-19 18:32:02 +00:00
parent 6e2b85b401
commit 1f4e5f77a0
6 changed files with 78 additions and 22 deletions

View File

@ -9,18 +9,3 @@
else else
strcpy(cfe_version, "unknown"); strcpy(cfe_version, "unknown");
printk(KERN_INFO PFX "CFE version: %s\n", cfe_version); 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;

View File

@ -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 <asm/bootinfo.h>
+
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_ */

View File

@ -0,0 +1,51 @@
--- a/drivers/mtd/bcm63xxpart.c
+++ b/drivers/mtd/bcm63xxpart.c
@@ -35,7 +35,7 @@
#include <linux/bcm963xx_tag.h>
#include <asm/mach-bcm63xx/bcm63xx_nvram.h>
-#include <asm/mach-bcm63xx/board_bcm963xx.h>
+#include <asm/mach-bcm63xx/bcm63xx_board.h>
#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,

View File

@ -15,7 +15,7 @@
/* 240-255: Unused at present */ /* 240-255: Unused at present */
--- a/drivers/mtd/bcm63xxpart.c --- a/drivers/mtd/bcm63xxpart.c
+++ b/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 { } else {
/* OpenWrt layout */ /* OpenWrt layout */
rootfsaddr = kerneladdr + kernellen; rootfsaddr = kerneladdr + kernellen;

View File

@ -7,7 +7,7 @@ contained in flash.
--- a/drivers/mtd/bcm63xxpart.c --- a/drivers/mtd/bcm63xxpart.c
+++ b/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; struct mtd_partition *parts;
int ret; int ret;
size_t retlen; size_t retlen;
@ -21,7 +21,7 @@ contained in flash.
int i; int i;
u32 computed_crc; u32 computed_crc;
bool rootfs_first = false; 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; cfelen = cfe_erasesize;
nvramlen = bcm63xx_nvram_get_psi_size(); nvramlen = bcm63xx_nvram_get_psi_size();
nvramlen = roundup(nvramlen, cfe_erasesize); nvramlen = roundup(nvramlen, cfe_erasesize);
@ -46,7 +46,7 @@ contained in flash.
/* Allocate memory for buffer */ /* Allocate memory for buffer */
buf = vmalloc(sizeof(struct bcm_tag)); 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; rootfsaddr = 0;
spareaddr = cfelen; spareaddr = cfelen;
} }
@ -55,7 +55,7 @@ contained in flash.
/* Determine number of partitions */ /* Determine number of partitions */
if (rootfslen > 0) 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) if (kernellen > 0)
nrparts++; nrparts++;
@ -68,7 +68,7 @@ contained in flash.
/* Ask kernel for more memory */ /* Ask kernel for more memory */
parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL); parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
if (!parts) { if (!parts) {
@@ -191,15 +217,32 @@ static int bcm63xx_parse_cfe_partitions( @@ -167,15 +193,32 @@ static int bcm63xx_parse_cfe_partitions(
curpart++; curpart++;
} }

View File

@ -433,7 +433,7 @@
--- a/drivers/mtd/bcm63xxpart.c --- a/drivers/mtd/bcm63xxpart.c
+++ b/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); BCM63XX_CFE_BLOCK_SIZE);
cfelen = cfe_erasesize; cfelen = cfe_erasesize;