diff options
Diffstat (limited to 'target')
3 files changed, 51 insertions, 7 deletions
| diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb2011.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb2011.c index 60baae9b7..46b8a053d 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb2011.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb2011.c @@ -39,11 +39,10 @@  #define RB2011_GPIO_NAND_NCE	14  #define RB_ROUTERBOOT_OFFSET	0x0000 -#define RB_ROUTERBOOT_SIZE	0xb000 -#define RB_HARD_CFG_OFFSET	0xb000 +#define RB_ROUTERBOOT_MIN_SIZE	0xb000  #define RB_HARD_CFG_SIZE	0x1000  #define RB_BIOS_OFFSET		0xd000 -#define RB_BIOS_SIZE		0x2000 +#define RB_BIOS_SIZE		0x1000  #define RB_SOFT_CFG_OFFSET	0xf000  #define RB_SOFT_CFG_SIZE	0x1000 @@ -53,11 +52,9 @@ static struct mtd_partition rb2011_spi_partitions[] = {  	{  		.name		= "routerboot",  		.offset		= RB_ROUTERBOOT_OFFSET, -		.size		= RB_ROUTERBOOT_SIZE,  		.mask_flags	= MTD_WRITEABLE,  	}, {  		.name		= "hard_config", -		.offset		= RB_HARD_CFG_OFFSET,  		.size		= RB_HARD_CFG_SIZE,  		.mask_flags	= MTD_WRITEABLE,  	}, { @@ -67,11 +64,29 @@ static struct mtd_partition rb2011_spi_partitions[] = {  		.mask_flags	= MTD_WRITEABLE,  	}, {  		.name		= "soft_config", -		.offset		= RB_SOFT_CFG_OFFSET,  		.size		= RB_SOFT_CFG_SIZE,  	}  }; + +static void __init rb2011_init_partitions(void) +{ +	u8 *addr = (u8 *) KSEG1ADDR(0x1f000000); +	u32 next = RB_ROUTERBOOT_MIN_SIZE; + +	if (routerboot_find_magic(addr, 0x10000, &next, true)) +		printk(KERN_ERR "Warning: could not find a valid RouterBOOT hard config\n"); +	rb2011_spi_partitions[0].size = next; +	rb2011_spi_partitions[1].offset = next; + +	next = RB_BIOS_OFFSET + RB_BIOS_SIZE; +	if (routerboot_find_magic(addr, 0x10000, &next, false)) +		printk(KERN_ERR "Warning: could not find a valid RouterBOOT soft config\n"); + +	rb2011_spi_partitions[3].offset = next; +} + +  static struct mtd_partition rb2011_nand_partitions[] = {  	{  		.name	= "booter", @@ -125,13 +140,14 @@ static struct mdio_board_info rb2011_mdio0_info[] = {  static void __init rb2011_wlan_init(void)  { -	u8 *hard_cfg = (u8 *) KSEG1ADDR(0x1f000000 + RB_HARD_CFG_OFFSET); +	u8 *hard_cfg = (u8 *) KSEG1ADDR(0x1f000000);  	u16 tag_len;  	u8 *tag;  	char *art_buf;  	u8 wlan_mac[ETH_ALEN];  	int err; +	hard_cfg += rb2011_spi_partitions[1].offset;  	err = routerboot_find_tag(hard_cfg, RB_HARD_CFG_SIZE, RB_ID_WLAN_DATA,  				  &tag, &tag_len);  	if (err) { @@ -211,6 +227,7 @@ static void __init rb2011_gpio_init(void)  static void __init rb2011_setup(void)  { +	rb2011_init_partitions();  	rb2011_gpio_init();  	ath79_register_m25p80(&rb2011_spi_flash_data); diff --git a/target/linux/ar71xx/files/arch/mips/ath79/routerboot.c b/target/linux/ar71xx/files/arch/mips/ath79/routerboot.c index 3c6f9aaeb..1cb1f9d4e 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/routerboot.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/routerboot.c @@ -30,6 +30,26 @@ static u16 get_u16(void *buf)  }  __init int +routerboot_find_magic(u8 *buf, unsigned int buflen, u32 *offset, bool hard) +{ +	u32 magic_ref = hard ? RB_MAGIC_HARD : RB_MAGIC_SOFT; +	u32 magic; +	u32 cur = *offset; + +	while (cur < buflen) { +		magic = get_u32(buf + cur); +		if (magic == magic_ref) { +			*offset = cur; +			return 0; +		} + +		cur += 0x1000; +	} + +	return -ENOENT; +} + +__init int  routerboot_find_tag(u8 *buf, unsigned int buflen, u16 tag_id,  		    u8 **tag_data, u16 *tag_len)  { diff --git a/target/linux/ar71xx/files/arch/mips/ath79/routerboot.h b/target/linux/ar71xx/files/arch/mips/ath79/routerboot.h index 9a4dde59e..2489e0aee 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/routerboot.h +++ b/target/linux/ar71xx/files/arch/mips/ath79/routerboot.h @@ -14,6 +14,7 @@  #ifdef CONFIG_ATH79_ROUTERBOOT  int routerboot_find_tag(u8 *buf, unsigned int buflen, u16 tag_id,  			u8 **tag_data, u16 *tag_len); +int routerboot_find_magic(u8 *buf, unsigned int buflen, u32 *offset, bool hard);  #else  static inline int  routerboot_find_tag(u8 *buf, unsigned int buflen, u16 tag_id, @@ -21,6 +22,12 @@ routerboot_find_tag(u8 *buf, unsigned int buflen, u16 tag_id,  {  	return -ENOENT;  } + +static inline int +routerboot_find_magic(u8 *buf, unsigned int buflen, u32 *offset, bool hard) +{ +	return -ENOENT; +}  #endif  #endif /* _ATH79_ROUTERBOOT_H_ */ | 
