diff options
23 files changed, 1447 insertions, 63 deletions
| diff --git a/target/linux/brcm63xx/patches-3.3/012-mtd-bcm63xxpart-handle-Broadcom-partition-order.patch b/target/linux/brcm63xx/patches-3.3/012-mtd-bcm63xxpart-handle-Broadcom-partition-order.patch new file mode 100644 index 000000000..b12aed6b9 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/012-mtd-bcm63xxpart-handle-Broadcom-partition-order.patch @@ -0,0 +1,101 @@ +From a73c2d9dc7ea0d14fbf48db48e783d123162f5c3 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Thu, 19 Apr 2012 13:15:57 +0200 +Subject: [PATCH] mtd: bcm63xxpart: handle Broadcom partition order + +The original Broadcom partition order has the root fs in front of the +kernel, which resulted in miscalculated partition sizes. +Detect when such an image is on the flash and also reorder the partitions +accordingly. + +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +Acked-by: Florian Fainelli <florian@openwrt.org> +Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@linux.intel.com> +--- + drivers/mtd/bcm63xxpart.c |   41 ++++++++++++++++++++++++++++++----------- + 1 file changed, 30 insertions(+), 11 deletions(-) + +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -4,7 +4,7 @@ +  * Copyright © 2006-2008  Florian Fainelli <florian@openwrt.org> +  *			  Mike Albon <malbon@openwrt.org> +  * Copyright © 2009-2010  Daniel Dickinson <openwrt@cshore.neomailbox.net> +- * Copyright © 2011 Jonas Gorski <jonas.gorski@gmail.com> ++ * Copyright © 2011-2012  Jonas Gorski <jonas.gorski@gmail.com> +  * +  * This program is free software; you can redistribute it and/or modify +  * it under the terms of the GNU General Public License as published by +@@ -82,6 +82,7 @@ static int bcm63xx_parse_cfe_partitions( + 	int namelen = 0; + 	int i; + 	u32 computed_crc; ++	bool rootfs_first = false; +  + 	if (bcm63xx_detect_cfe(master)) + 		return -EINVAL; +@@ -109,6 +110,7 @@ static int bcm63xx_parse_cfe_partitions( + 		char *boardid = &(buf->board_id[0]); + 		char *tagversion = &(buf->tag_version[0]); +  ++		sscanf(buf->flash_image_start, "%u", &rootfsaddr); + 		sscanf(buf->kernel_address, "%u", &kerneladdr); + 		sscanf(buf->kernel_length, "%u", &kernellen); + 		sscanf(buf->total_length, "%u", &totallen); +@@ -117,10 +119,19 @@ static int bcm63xx_parse_cfe_partitions( + 			tagversion, boardid); +  + 		kerneladdr = kerneladdr - BCM63XX_EXTENDED_SIZE; +-		rootfsaddr = kerneladdr + kernellen; ++		rootfsaddr = rootfsaddr - BCM63XX_EXTENDED_SIZE; + 		spareaddr = roundup(totallen, master->erasesize) + cfelen; + 		sparelen = master->size - spareaddr - nvramlen; +-		rootfslen = spareaddr - rootfsaddr; ++ ++		if (rootfsaddr < kerneladdr) { ++			/* default Broadcom layout */ ++			rootfslen = kerneladdr - rootfsaddr; ++			rootfs_first = true; ++		} else { ++			/* OpenWrt layout */ ++			rootfsaddr = kerneladdr + kernellen; ++			rootfslen = spareaddr - rootfsaddr; ++		} + 	} else { + 		pr_warn("CFE boot tag CRC invalid (expected %08x, actual %08x)\n", + 			buf->header_crc, computed_crc); +@@ -156,18 +167,26 @@ static int bcm63xx_parse_cfe_partitions( + 	curpart++; +  + 	if (kernellen > 0) { +-		parts[curpart].name = "kernel"; +-		parts[curpart].offset = kerneladdr; +-		parts[curpart].size = kernellen; ++		int kernelpart = curpart; ++ ++		if (rootfslen > 0 && rootfs_first) ++			kernelpart++; ++		parts[kernelpart].name = "kernel"; ++		parts[kernelpart].offset = kerneladdr; ++		parts[kernelpart].size = kernellen; + 		curpart++; + 	} +  + 	if (rootfslen > 0) { +-		parts[curpart].name = "rootfs"; +-		parts[curpart].offset = rootfsaddr; +-		parts[curpart].size = rootfslen; +-		if (sparelen > 0) +-			parts[curpart].size += sparelen; ++		int rootfspart = curpart; ++ ++		if (kernellen > 0 && rootfs_first) ++			rootfspart--; ++		parts[rootfspart].name = "rootfs"; ++		parts[rootfspart].offset = rootfsaddr; ++		parts[rootfspart].size = rootfslen; ++		if (sparelen > 0  && !rootfs_first) ++			parts[rootfspart].size += sparelen; + 		curpart++; + 	} +  diff --git a/target/linux/brcm63xx/patches-3.3/101-MTD-bcm63xxpart-remove-unused-variable.patch b/target/linux/brcm63xx/patches-3.3/101-MTD-bcm63xxpart-remove-unused-variable.patch new file mode 100644 index 000000000..470f96663 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/101-MTD-bcm63xxpart-remove-unused-variable.patch @@ -0,0 +1,41 @@ +From 2962bbe9cc807549c0705551c5b7be47e34e3fac Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Mon, 30 Apr 2012 09:32:56 +0200 +Subject: [PATCH 20/79] MTD: bcm63xxpart: remove unused variable + +namelen is never used, so drop it. + +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +--- + drivers/mtd/bcm63xxpart.c |   11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -79,7 +79,6 @@ static int bcm63xx_parse_cfe_partitions( + 	unsigned int rootfsaddr, kerneladdr, spareaddr; + 	unsigned int rootfslen, kernellen, sparelen, totallen; + 	unsigned int cfelen, nvramlen; +-	int namelen = 0; + 	int i; + 	u32 computed_crc; + 	bool rootfs_first = false; +@@ -143,15 +142,11 @@ static int bcm63xx_parse_cfe_partitions( + 	} +  + 	/* Determine number of partitions */ +-	namelen = 8; +-	if (rootfslen > 0) { ++	if (rootfslen > 0) + 		nrparts++; +-		namelen += 6; +-	} +-	if (kernellen > 0) { ++ ++	if (kernellen > 0) + 		nrparts++; +-		namelen += 6; +-	} +  + 	/* Ask kernel for more memory */ + 	parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL); diff --git a/target/linux/brcm63xx/patches-3.3/102-MTD-bcm63xxpart-merge-sparelen-calculation.patch b/target/linux/brcm63xx/patches-3.3/102-MTD-bcm63xxpart-merge-sparelen-calculation.patch new file mode 100644 index 000000000..da24b1b85 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/102-MTD-bcm63xxpart-merge-sparelen-calculation.patch @@ -0,0 +1,33 @@ +From fd2ab39f22af4176eb3d23acbc4d1218cf835065 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 8 May 2012 09:47:32 +0200 +Subject: [PATCH 21/79] MTD: bcm63xxpart: merge sparelen calculation + +The length of the spare part is calculated the same way in both branches +so move to a common place. + +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +--- + drivers/mtd/bcm63xxpart.c |    3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -120,7 +120,6 @@ static int bcm63xx_parse_cfe_partitions( + 		kerneladdr = kerneladdr - BCM63XX_EXTENDED_SIZE; + 		rootfsaddr = rootfsaddr - BCM63XX_EXTENDED_SIZE; + 		spareaddr = roundup(totallen, master->erasesize) + cfelen; +-		sparelen = master->size - spareaddr - nvramlen; +  + 		if (rootfsaddr < kerneladdr) { + 			/* default Broadcom layout */ +@@ -138,8 +137,8 @@ static int bcm63xx_parse_cfe_partitions( + 		rootfslen = 0; + 		rootfsaddr = 0; + 		spareaddr = cfelen; +-		sparelen = master->size - cfelen - nvramlen; + 	} ++	sparelen = master->size - spareaddr - nvramlen; +  + 	/* Determine number of partitions */ + 	if (rootfslen > 0) diff --git a/target/linux/brcm63xx/patches-3.3/103-MTD-bcm63xxpart-make-fixed-part-length-calculation-m.patch b/target/linux/brcm63xx/patches-3.3/103-MTD-bcm63xxpart-make-fixed-part-length-calculation-m.patch new file mode 100644 index 000000000..ca0cddde9 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/103-MTD-bcm63xxpart-make-fixed-part-length-calculation-m.patch @@ -0,0 +1,49 @@ +From 465f1b3ff24dbf3bec43dce344a7bc2640e05ffc Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 8 May 2012 09:53:07 +0200 +Subject: [PATCH 22/79] MTD: bcm63xxpart: make fixed part length calculation + more generic + +The CFE does not use 4K sectors even if the flash supports it, so +for the fixed partitions like CFE itself or NVRAM the erase block +size is always 64k or bigger. + +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +--- + drivers/mtd/bcm63xxpart.c |   11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -37,8 +37,7 @@ +  + #define BCM63XX_EXTENDED_SIZE	0xBFC00000	/* Extended flash address */ +  +-#define BCM63XX_MIN_CFE_SIZE	0x10000		/* always at least 64KiB */ +-#define BCM63XX_MIN_NVRAM_SIZE	0x10000		/* always at least 64KiB */ ++#define BCM63XX_CFE_BLOCK_SIZE	0x10000		/* always at least 64KiB */ +  + #define BCM63XX_CFE_MAGIC_OFFSET 0x4e0 +  +@@ -79,6 +78,7 @@ static int bcm63xx_parse_cfe_partitions( + 	unsigned int rootfsaddr, kerneladdr, spareaddr; + 	unsigned int rootfslen, kernellen, sparelen, totallen; + 	unsigned int cfelen, nvramlen; ++	unsigned int cfe_erasesize; + 	int i; + 	u32 computed_crc; + 	bool rootfs_first = false; +@@ -86,8 +86,11 @@ static int bcm63xx_parse_cfe_partitions( + 	if (bcm63xx_detect_cfe(master)) + 		return -EINVAL; +  +-	cfelen = max_t(uint32_t, master->erasesize, BCM63XX_MIN_CFE_SIZE); +-	nvramlen = max_t(uint32_t, master->erasesize, BCM63XX_MIN_NVRAM_SIZE); ++	cfe_erasesize = max_t(uint32_t, master->erasesize, ++			      BCM63XX_CFE_BLOCK_SIZE); ++ ++	cfelen = cfe_erasesize; ++	nvramlen = cfe_erasesize; +  + 	/* Allocate memory for buffer */ + 	buf = vmalloc(sizeof(struct bcm_tag)); diff --git a/target/linux/brcm63xx/patches-3.3/104-MTD-bcm63xxpart-move-the-last-curpart-to-its-correct.patch b/target/linux/brcm63xx/patches-3.3/104-MTD-bcm63xxpart-move-the-last-curpart-to-its-correct.patch new file mode 100644 index 000000000..8e05803ff --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/104-MTD-bcm63xxpart-move-the-last-curpart-to-its-correct.patch @@ -0,0 +1,26 @@ +From d5173b2c806f4039679b001f1b55a3c245afdf68 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 8 May 2012 10:02:13 +0200 +Subject: [PATCH 23/79] MTD: bcm63xxpart: move the last curpart++ to its + correct place + +The line belongs above the comment, not below it. + +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +--- + drivers/mtd/bcm63xxpart.c |    2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -190,9 +190,9 @@ static int bcm63xx_parse_cfe_partitions( + 	parts[curpart].name = "nvram"; + 	parts[curpart].offset = master->size - nvramlen; + 	parts[curpart].size = nvramlen; ++	curpart++; +  + 	/* Global partition "linux" to make easy firmware upgrade */ +-	curpart++; + 	parts[curpart].name = "linux"; + 	parts[curpart].offset = cfelen; + 	parts[curpart].size = master->size - cfelen - nvramlen; diff --git a/target/linux/brcm63xx/patches-3.3/105-MTD-bcm63xxpart-use-correct-printk-format-for-partit.patch b/target/linux/brcm63xx/patches-3.3/105-MTD-bcm63xxpart-use-correct-printk-format-for-partit.patch new file mode 100644 index 000000000..60396abae --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/105-MTD-bcm63xxpart-use-correct-printk-format-for-partit.patch @@ -0,0 +1,27 @@ +From 55aa355612ce55dc1943f116ea49e795a098b60c Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 8 May 2012 10:03:27 +0200 +Subject: [PATCH 24/79] MTD: bcm63xxpart: use correct printk format for + partitions + +Use ll to be able to remove the casts. + +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +--- + drivers/mtd/bcm63xxpart.c |    5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -198,9 +198,8 @@ static int bcm63xx_parse_cfe_partitions( + 	parts[curpart].size = master->size - cfelen - nvramlen; +  + 	for (i = 0; i < nrparts; i++) +-		pr_info("Partition %d is %s offset %lx and length %lx\n", i, +-			parts[i].name, (long unsigned int)(parts[i].offset), +-			(long unsigned int)(parts[i].size)); ++		pr_info("Partition %d is %s offset %llx and length %llx\n", i, ++			parts[i].name, parts[i].offset,	parts[i].size); +  + 	pr_info("Spare partition is offset %x and length %x\n",	spareaddr, + 		sparelen); diff --git a/target/linux/brcm63xx/patches-3.3/405-bcm963xx_real_rootfs_length.patch b/target/linux/brcm63xx/patches-3.3/405-bcm963xx_real_rootfs_length.patch index 0476699ed..856b9e267 100644 --- a/target/linux/brcm63xx/patches-3.3/405-bcm963xx_real_rootfs_length.patch +++ b/target/linux/brcm63xx/patches-3.3/405-bcm963xx_real_rootfs_length.patch @@ -15,30 +15,13 @@   	/* 240-255: Unused at present */  --- a/drivers/mtd/bcm63xxpart.c  +++ b/drivers/mtd/bcm63xxpart.c -@@ -77,7 +77,7 @@ static int bcm63xx_parse_cfe_partitions( - 	int ret; - 	size_t retlen; - 	unsigned int rootfsaddr, kerneladdr, spareaddr; --	unsigned int rootfslen, kernellen, sparelen, totallen; -+	unsigned int rootfslen, kernellen, sparelen; - 	unsigned int cfelen, nvramlen; - 	int namelen = 0; - 	int i; -@@ -111,14 +111,15 @@ static int bcm63xx_parse_cfe_partitions( -  - 		sscanf(buf->kernel_address, "%u", &kerneladdr); - 		sscanf(buf->kernel_length, "%u", &kernellen); --		sscanf(buf->total_length, "%u", &totallen); -+		rootfslen = buf->real_rootfs_length; -  - 		pr_info("CFE boot tag found with version %s and board type %s\n", - 			tagversion, boardid); -  - 		kerneladdr = kerneladdr - BCM63XX_EXTENDED_SIZE; - 		rootfsaddr = kerneladdr + kernellen; --		spareaddr = roundup(totallen, master->erasesize) + cfelen; -+		rootfslen = roundup(rootfslen, master->erasesize); -+		spareaddr = rootfsaddr + rootfslen; - 		sparelen = master->size - spareaddr - nvramlen; - 		rootfslen = spareaddr - rootfsaddr; +@@ -131,7 +131,8 @@ static int bcm63xx_parse_cfe_partitions( + 		} else { + 			/* OpenWrt layout */ + 			rootfsaddr = kerneladdr + kernellen; +-			rootfslen = spareaddr - rootfsaddr; ++			rootfslen = buf->real_rootfs_length; ++			spareaddr = rootfsaddr + rootfslen; + 		}   	} else { + 		pr_warn("CFE boot tag CRC invalid (expected %08x, actual %08x)\n", diff --git a/target/linux/brcm63xx/patches-3.3/421-MIPS-BCM63XX-move-nvram-related-functions-into-their.patch b/target/linux/brcm63xx/patches-3.3/421-MIPS-BCM63XX-move-nvram-related-functions-into-their.patch new file mode 100644 index 000000000..bc0096780 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/421-MIPS-BCM63XX-move-nvram-related-functions-into-their.patch @@ -0,0 +1,351 @@ +From 5b753c1d01c6af23d7d37d37d9de30da8a971084 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Sat, 12 May 2012 22:51:08 +0200 +Subject: [PATCH 60/79] MIPS: BCM63XX: move nvram related functions into their + own file + +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +--- + arch/mips/bcm63xx/Makefile                         |    6 +- + arch/mips/bcm63xx/boards/board_bcm963xx.c          |   74 +++-------------- + arch/mips/bcm63xx/nvram.c                          |   84 ++++++++++++++++++++ + arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h |   34 ++++++++ + .../mips/include/asm/mach-bcm63xx/board_bcm963xx.h |   17 ---- + 5 files changed, 134 insertions(+), 81 deletions(-) + create mode 100644 arch/mips/bcm63xx/nvram.c + create mode 100644 arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h + +--- a/arch/mips/bcm63xx/Makefile ++++ b/arch/mips/bcm63xx/Makefile +@@ -1,6 +1,6 @@ +-obj-y		+= clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \ +-		   dev-dsp.o dev-enet.o dev-flash.o dev-hsspi.o dev-pcmcia.o \ +-		   dev-spi.o dev-trng.o dev-uart.o dev-usb-ehci.o \ ++obj-y		+= clk.o cpu.o cs.o gpio.o irq.o nvram.o prom.o setup.o \ ++		   timer.o dev-dsp.o dev-enet.o dev-flash.o dev-hsspi.o \ ++		   dev-pcmcia.o dev-spi.o dev-trng.o dev-uart.o dev-usb-ehci.o \ + 		   dev-usb-ohci.o dev-wdt.o + obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o +  +--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c ++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c +@@ -20,6 +20,7 @@ + #include <bcm63xx_dev_uart.h> + #include <bcm63xx_regs.h> + #include <bcm63xx_io.h> ++#include <bcm63xx_nvram.h> + #include <bcm63xx_dev_pci.h> + #include <bcm63xx_dev_enet.h> + #include <bcm63xx_dev_dsp.h> +@@ -40,8 +41,6 @@ + #define CFE_OFFSET_64K		0x10000 + #define CFE_OFFSET_128K		0x20000 +  +-static struct bcm963xx_nvram nvram; +-static unsigned int mac_addr_used; + static struct board_info board; +  + /* +@@ -695,50 +694,16 @@ const char *board_get_name(void) + 	return board.name; + } +  +-/* +- * register & return a new board mac address +- */ +-static int board_get_mac_address(u8 *mac) +-{ +-	u8 *p; +-	int count; +- +-	if (mac_addr_used >= nvram.mac_addr_count) { +-		printk(KERN_ERR PFX "not enough mac address\n"); +-		return -ENODEV; +-	} +- +-	memcpy(mac, nvram.mac_addr_base, ETH_ALEN); +-	p = mac + ETH_ALEN - 1; +-	count = mac_addr_used; +- +-	while (count--) { +-		do { +-			(*p)++; +-			if (*p != 0) +-				break; +-			p--; +-		} while (p != mac); +-	} +- +-	if (p == mac) { +-		printk(KERN_ERR PFX "unable to fetch mac address\n"); +-		return -ENODEV; +-	} +- +-	mac_addr_used++; +-	return 0; +-} +- + static void __init boardid_fixup(u8 *boot_addr) + { + 	struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K); ++	char *board_name = (char *)bcm63xx_nvram_get_name(); +  + 	/* check if bcm_tag is at 64k offset */ +-	if (strncmp(nvram.name, tag->boardid, BOARDID_LEN) != 0) { ++	if (strncmp(board_name, tag->boardid, BOARDID_LEN) != 0) { + 		/* else try 128k */ + 		tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_128K); +-		if (strncmp(nvram.name, tag->boardid, BOARDID_LEN) != 0) { ++		if (strncmp(board_name, tag->boardid, BOARDID_LEN) != 0) { + 			/* No tag found */ + 			printk(KERN_DEBUG "No bcm_tag found!\n"); + 			return; +@@ -748,9 +713,9 @@ static void __init boardid_fixup(u8 *boo + 	if (tag->information1[0] != '+') + 		return; +  +-	strncpy(nvram.name, &tag->information1[1], BOARDID_LEN); ++	strncpy(board_name, &tag->information1[1], BOARDID_LEN); +  +-	printk(KERN_INFO "Overriding boardid with '%s'\n", nvram.name); ++	printk(KERN_INFO "Overriding boardid with '%s'\n", board_name); + } +  + /* +@@ -758,9 +723,10 @@ static void __init boardid_fixup(u8 *boo +  */ + void __init board_prom_init(void) + { +-	unsigned int check_len, i; +-	u8 *boot_addr, *cfe, *p; ++	unsigned int i; ++	u8 *boot_addr, *cfe; + 	char cfe_version[32]; ++	char *board_name; + 	u32 val; +  + 	/* read base address of boot chip select (0) +@@ -782,32 +748,19 @@ void __init board_prom_init(void) + 		strcpy(cfe_version, "unknown"); + 	printk(KERN_INFO PFX "CFE version: %s\n", cfe_version); +  +-	/* extract nvram data */ +-	memcpy(&nvram, boot_addr + BCM963XX_NVRAM_OFFSET, sizeof(nvram)); +- +-	/* check checksum before using data */ +-	if (nvram.version <= 4) +-		check_len = offsetof(struct bcm963xx_nvram, checksum_old); +-	else +-		check_len = sizeof(nvram); +-	val = 0; +-	p = (u8 *)&nvram; +-	while (check_len--) +-		val += *p; +-	if (val) { +-		printk(KERN_ERR PFX "invalid nvram checksum\n"); ++	if (bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET)) + 		return; +-	} +  + 	if (strcmp(cfe_version, "unknown") != 0) { + 		/* cfe present */ + 		boardid_fixup(boot_addr); + 	} +  ++	board_name = bcm63xx_nvram_get_name(); + 	/* find board by name */ + 	for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) { +-		if (strncmp(nvram.name, bcm963xx_boards[i]->name, +-			    sizeof(nvram.name))) ++		if (strncmp(board_name, bcm963xx_boards[i]->name, ++			    BCM63XX_NVRAM_NAMELEN)) + 			continue; + 		/* copy, board desc array is marked initdata */ + 		memcpy(&board, bcm963xx_boards[i], sizeof(board)); +@@ -817,7 +770,7 @@ void __init board_prom_init(void) + 	/* bail out if board is not found, will complain later */ + 	if (!board.name[0]) { + 		char name[17]; +-		memcpy(name, nvram.name, 16); ++		memcpy(name, board_name, 16); + 		name[16] = 0; + 		printk(KERN_ERR PFX "unknown bcm963xx board: %s\n", + 		       name); +@@ -909,15 +862,15 @@ int __init board_register_devices(void) + 		bcm63xx_pcmcia_register(); +  + 	if (board.has_enet0 && +-	    !board_get_mac_address(board.enet0.mac_addr)) ++	    !bcm63xx_nvram_get_mac_address(board.enet0.mac_addr)) + 		bcm63xx_enet_register(0, &board.enet0); +  + 	if (board.has_enet1 && +-	    !board_get_mac_address(board.enet1.mac_addr)) ++	    !bcm63xx_nvram_get_mac_address(board.enet1.mac_addr)) + 		bcm63xx_enet_register(1, &board.enet1); +  + 	if (board.has_enetsw && +-	    !board_get_mac_address(board.enetsw.mac_addr)) ++	    !bcm63xx_nvram_get_mac_address(board.enetsw.mac_addr)) + 		bcm63xx_enetsw_register(&board.enetsw); +  + 	if (board.has_ehci0) +@@ -933,7 +886,7 @@ int __init board_register_devices(void) + 	 * do this after registering enet devices + 	 */ + #ifdef CONFIG_SSB_PCIHOST +-	if (!board_get_mac_address(bcm63xx_sprom.il0mac)) { ++	if (!bcm63xx_nvram_get_mac_address(bcm63xx_sprom.il0mac)) { + 		memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN); + 		memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN); + 		if (ssb_arch_register_fallback_sprom( +--- /dev/null ++++ b/arch/mips/bcm63xx/nvram.c +@@ -0,0 +1,84 @@ ++/* ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License.  See the file "COPYING" in the main directory of this archive ++ * for more details. ++ * ++ * Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com> ++ */ ++ ++#define pr_fmt(fmt) "bcm63xx_nvram: " fmt ++ ++#include <linux/init.h> ++#include <linux/export.h> ++#include <linux/kernel.h> ++ ++#include <bcm63xx_nvram.h> ++ ++static struct bcm963xx_nvram nvram; ++static int mac_addr_used; ++ ++int __init bcm63xx_nvram_init(void *addr) ++{ ++	unsigned int check_len; ++	u8 *p; ++	u32 val; ++ ++	/* extract nvram data */ ++	memcpy(&nvram, addr, sizeof(nvram)); ++ ++	/* check checksum before using data */ ++	if (nvram.version <= 4) ++		check_len = offsetof(struct bcm963xx_nvram, checksum_old); ++	else ++		check_len = sizeof(nvram); ++	val = 0; ++	p = (u8 *)&nvram; ++ ++	while (check_len--) ++		val += *p; ++	if (val) { ++		pr_err("invalid nvram checksum\n"); ++		return -EINVAL; ++	} ++ ++	return 0; ++} ++ ++u8 *bcm63xx_nvram_get_name(void) ++{ ++	return nvram.name; ++} ++EXPORT_SYMBOL(bcm63xx_nvram_get_name); ++ ++int bcm63xx_nvram_get_mac_address(u8 *mac) ++{ ++	u8 *p; ++	int count; ++ ++	if (mac_addr_used >= nvram.mac_addr_count) { ++		pr_err("not enough mac address\n"); ++		return -ENODEV; ++	} ++ ++	memcpy(mac, nvram.mac_addr_base, ETH_ALEN); ++	p = mac + ETH_ALEN - 1; ++	count = mac_addr_used; ++ ++	while (count--) { ++		do { ++			(*p)++; ++			if (*p != 0) ++				break; ++			p--; ++		} while (p != mac); ++	} ++ ++	if (p == mac) { ++		pr_err("unable to fetch mac address\n"); ++		return -ENODEV; ++	} ++ ++	mac_addr_used++; ++	return 0; ++} ++EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address); +--- /dev/null ++++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h +@@ -0,0 +1,34 @@ ++#ifndef BCM63XX_NVRAM_H ++#define BCM63XX_NVRAM_H ++ ++#include <linux/if_ether.h> ++ ++#define BCM63XX_NVRAM_NAMELEN		16 ++ ++/* ++ * nvram structure ++ */ ++struct bcm963xx_nvram { ++	u32	version; ++	u8	reserved1[256]; ++	u8	name[BCM63XX_NVRAM_NAMELEN]; ++	u32	main_tp_number; ++	u32	psi_size; ++	u32	mac_addr_count; ++	u8	mac_addr_base[ETH_ALEN]; ++	u8	reserved2[2]; ++	u32	checksum_old; ++	u8	reserved3[720]; ++	u32	checksum_high; ++}; ++ ++int __init bcm63xx_nvram_init(void *); ++ ++u8 *bcm63xx_nvram_get_name(void); ++ ++/* ++ * register & return a new board mac address ++ */ ++int bcm63xx_nvram_get_mac_address(u8 *mac); ++ ++#endif /* BCM63XX_NVRAM_H */ +--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h ++++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h +@@ -15,23 +15,6 @@ + #define BCM963XX_NVRAM_OFFSET		0x580 +  + /* +- * nvram structure +- */ +-struct bcm963xx_nvram { +-	u32	version; +-	u8	reserved1[256]; +-	u8	name[16]; +-	u32	main_tp_number; +-	u32	psi_size; +-	u32	mac_addr_count; +-	u8	mac_addr_base[6]; +-	u8	reserved2[2]; +-	u32	checksum_old; +-	u8	reserved3[720]; +-	u32	checksum_high; +-}; +- +-/* +  * board definition +  */ + struct board_info { diff --git a/target/linux/brcm63xx/patches-3.3/422-MIPS-BCM63XX-export-PSI-size-from-nvram.patch b/target/linux/brcm63xx/patches-3.3/422-MIPS-BCM63XX-export-PSI-size-from-nvram.patch new file mode 100644 index 000000000..34966b27f --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/422-MIPS-BCM63XX-export-PSI-size-from-nvram.patch @@ -0,0 +1,44 @@ +From ffbeb183bf0e9e12fd607c5352f48420c32f588f Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Sat, 12 May 2012 23:04:17 +0200 +Subject: [PATCH 61/79] MIPS: BCM63XX: export PSI size from nvram + +Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> +--- + arch/mips/bcm63xx/nvram.c                          |   11 +++++++++++ + arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h |    2 ++ + 2 files changed, 13 insertions(+) + +--- a/arch/mips/bcm63xx/nvram.c ++++ b/arch/mips/bcm63xx/nvram.c +@@ -14,6 +14,8 @@ +  + #include <bcm63xx_nvram.h> +  ++#define BCM63XX_DEFAULT_PSI_SIZE	64 ++ + static struct bcm963xx_nvram nvram; + static int mac_addr_used; +  +@@ -82,3 +84,12 @@ int bcm63xx_nvram_get_mac_address(u8 *ma + 	return 0; + } + EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address); ++ ++int bcm63xx_nvram_get_psi_size(void) ++{ ++	if (nvram.psi_size > 0) ++		return nvram.psi_size; ++ ++	return BCM63XX_DEFAULT_PSI_SIZE; ++} ++EXPORT_SYMBOL(bcm63xx_nvram_get_psi_size); +--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h ++++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h +@@ -31,4 +31,6 @@ u8 *bcm63xx_nvram_get_name(void); +  */ + int bcm63xx_nvram_get_mac_address(u8 *mac); +  ++int bcm63xx_nvram_get_psi_size(void); ++ + #endif /* BCM63XX_NVRAM_H */ diff --git a/target/linux/brcm63xx/patches-3.3/423-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch b/target/linux/brcm63xx/patches-3.3/423-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch new file mode 100644 index 000000000..5ca6f4797 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/423-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch @@ -0,0 +1,29 @@ +From 658afad639a9456e1bb6fe5bba0032f3c0c3f699 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 1 May 2012 14:10:39 +0200 +Subject: [PATCH 62/79] MTD: bcm63xxpart: use nvram for PSI size + +--- + drivers/mtd/bcm63xxpart.c |    4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -32,6 +32,7 @@ + #include <linux/mtd/mtd.h> + #include <linux/mtd/partitions.h> +  ++#include <asm/mach-bcm63xx/bcm63xx_nvram.h> + #include <asm/mach-bcm63xx/bcm963xx_tag.h> + #include <asm/mach-bcm63xx/board_bcm963xx.h> +  +@@ -90,7 +91,8 @@ static int bcm63xx_parse_cfe_partitions( + 			      BCM63XX_CFE_BLOCK_SIZE); +  + 	cfelen = cfe_erasesize; +-	nvramlen = cfe_erasesize; ++	nvramlen = bcm63xx_nvram_get_psi_size() * 1024; ++	nvramlen = roundup(nvramlen, cfe_erasesize); +  + 	/* Allocate memory for buffer */ + 	buf = vmalloc(sizeof(struct bcm_tag)); diff --git a/target/linux/brcm63xx/patches-3.3/424-MTD-physmap-allow-passing-pp_data.patch b/target/linux/brcm63xx/patches-3.3/424-MTD-physmap-allow-passing-pp_data.patch new file mode 100644 index 000000000..f869911d5 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/424-MTD-physmap-allow-passing-pp_data.patch @@ -0,0 +1,41 @@ +From 266c506f4b262bd6aba0776a03d82c98e65d9906 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 1 May 2012 17:32:36 +0200 +Subject: [PATCH 63/79] MTD: physmap: allow passing pp_data + +--- + drivers/mtd/maps/physmap.c  |    4 +++- + include/linux/mtd/physmap.h |    1 + + 2 files changed, 4 insertions(+), 1 deletion(-) + +--- a/drivers/mtd/maps/physmap.c ++++ b/drivers/mtd/maps/physmap.c +@@ -84,6 +84,7 @@ static int physmap_flash_probe(struct pl + { + 	struct physmap_flash_data *physmap_data; + 	struct physmap_flash_info *info; ++	struct mtd_part_parser_data *pp_data; + 	const char **probe_type; + 	const char **part_types; + 	int err = 0; +@@ -173,8 +174,9 @@ static int physmap_flash_probe(struct pl + 		goto err_out; +  + 	part_types = physmap_data->part_probe_types ? : part_probe_types; ++	pp_data = physmap_data->pp_data ? physmap_data->pp_data : NULL; +  +-	mtd_device_parse_register(info->cmtd, part_types, 0, ++	mtd_device_parse_register(info->cmtd, part_types, pp_data, + 				  physmap_data->parts, physmap_data->nr_parts); + 	return 0; +  +--- a/include/linux/mtd/physmap.h ++++ b/include/linux/mtd/physmap.h +@@ -32,6 +32,7 @@ struct physmap_flash_data { + 	char                    *probe_type; + 	struct mtd_partition	*parts; + 	const char		**part_probe_types; ++	struct mtd_part_parser_data *pp_data; + }; +  + #endif /* __LINUX_MTD_PHYSMAP__ */ diff --git a/target/linux/brcm63xx/patches-3.3/425-BCM63XX-allow-providing-fixup-data-in-board-data.patch b/target/linux/brcm63xx/patches-3.3/425-BCM63XX-allow-providing-fixup-data-in-board-data.patch new file mode 100644 index 000000000..d4085052b --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/425-BCM63XX-allow-providing-fixup-data-in-board-data.patch @@ -0,0 +1,81 @@ +From 5131195413b62df73dfd394fea272830ea8c4e1a Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Thu, 3 May 2012 14:40:03 +0200 +Subject: [PATCH 67/80] BCM63XX: allow providing fixup data in board data + +--- + arch/mips/bcm63xx/boards/board_bcm963xx.c           |   10 +++++++++- + arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h |   10 ++++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c ++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c +@@ -32,6 +32,7 @@ + #include <bcm63xx_dev_usb_ehci.h> + #include <board_bcm963xx.h> + #include <bcm_tag.h> ++#include <pci_ath9k_fixup.h> +  + #define PFX	"board_bcm963xx: " +  +@@ -851,6 +852,7 @@ int __init board_register_devices(void) + { + 	int button_count = 0; + 	int led_count = 0; ++	int i; +  + 	if (board.has_uart0) + 		bcm63xx_uart_register(0); +@@ -886,7 +888,8 @@ int __init board_register_devices(void) + 	 * do this after registering enet devices + 	 */ + #ifdef CONFIG_SSB_PCIHOST +-	if (!bcm63xx_nvram_get_mac_address(bcm63xx_sprom.il0mac)) { ++	if (!board.has_caldata && ++	    !bcm63xx_nvram_get_mac_address(bcm63xx_sprom.il0mac)) { + 		memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN); + 		memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN); + 		if (ssb_arch_register_fallback_sprom( +@@ -931,5 +934,9 @@ int __init board_register_devices(void) + 		bcm63xx_pci_register(); + #endif +  ++	/* register any fixups */ ++	for (i = 0; i < board.has_caldata; i++) ++		pci_enable_ath9k_fixup(board.caldata[i].slot, board.caldata[i].caldata_offset); ++ + 	return 0; + } +--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h ++++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h +@@ -7,6 +7,7 @@ + #include <linux/leds.h> + #include <bcm63xx_dev_enet.h> + #include <bcm63xx_dev_dsp.h> ++#include <pci_ath9k_fixup.h> +  + /* +  * flash mapping +@@ -14,6 +15,11 @@ + #define BCM963XX_CFE_VERSION_OFFSET	0x570 + #define BCM963XX_NVRAM_OFFSET		0x580 +  ++struct ath9k_caldata { ++	unsigned int	slot; ++	u32		caldata_offset; ++}; ++ + /* +  * board definition +  */ +@@ -32,6 +38,10 @@ struct board_info { + 	unsigned int	has_dsp:1; + 	unsigned int	has_uart0:1; + 	unsigned int	has_uart1:1; ++	unsigned int	has_caldata:2; ++ ++	/* wifi calibration data config */ ++	struct ath9k_caldata caldata[2]; +  + 	/* ethernet config */ + 	struct bcm63xx_enet_platform_data enet0; diff --git a/target/linux/brcm63xx/patches-3.3/426-MTD-m25p80-allow-passing-pp_data.patch b/target/linux/brcm63xx/patches-3.3/426-MTD-m25p80-allow-passing-pp_data.patch new file mode 100644 index 000000000..bda48079e --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/426-MTD-m25p80-allow-passing-pp_data.patch @@ -0,0 +1,40 @@ +From 7f17dfe9009beb07a3de0e380932a725293829df Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 1 May 2012 17:33:03 +0200 +Subject: [PATCH 64/79] MTD: m25p80: allow passing pp_data + +--- + drivers/mtd/devices/m25p80.c |    3 +++ + include/linux/spi/flash.h    |    2 ++ + 2 files changed, 5 insertions(+) + +--- a/drivers/mtd/devices/m25p80.c ++++ b/drivers/mtd/devices/m25p80.c +@@ -886,6 +886,9 @@ static int __devinit m25p_probe(struct s + 			dev_warn(&spi->dev, "unrecognized id %s\n", data->type); + 	} +  ++	if (data && data->pp_data) ++		memcpy(&ppdata, data->pp_data, sizeof(ppdata)); ++ + 	info = (void *)id->driver_data; +  + 	if (info->jedec_id) { +--- a/include/linux/spi/flash.h ++++ b/include/linux/spi/flash.h +@@ -12,6 +12,7 @@ struct mtd_part_parser_data; +  *	with chips that can't be queried for JEDEC or other IDs +  * @part_probe_types: optional list of MTD parser names to use for +  *	partitioning ++ * @pp_data: optional partition parser data. +  * +  * @max_transfer_len: option maximum read/write length limitation for +  *	SPI controllers not able to transfer any length commands. +@@ -30,6 +31,7 @@ struct flash_platform_data { + 	char		*type; +  + 	const char	**part_probe_types; ++	struct mtd_part_parser_data *pp_data; +  + 	unsigned int	max_transfer_len; + 	/* we'll likely add more ... use JEDEC IDs, etc */ diff --git a/target/linux/brcm63xx/patches-3.3/427-MTD-m25p80-allow-passing-pp_data.patch b/target/linux/brcm63xx/patches-3.3/427-MTD-m25p80-allow-passing-pp_data.patch new file mode 100644 index 000000000..51836f561 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/427-MTD-m25p80-allow-passing-pp_data.patch @@ -0,0 +1,109 @@ +From 087a67d5750a51f5b0851228b5b2518f3300f7d8 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Thu, 3 May 2012 12:17:54 +0200 +Subject: [PATCH 65/79] MIPS: BCM63XX: store the flash type in global variable + +--- + arch/mips/bcm63xx/dev-flash.c                      |   36 +++++++++++++------- + .../include/asm/mach-bcm63xx/bcm63xx_dev_flash.h   |    2 ++ + 2 files changed, 26 insertions(+), 12 deletions(-) + +--- a/arch/mips/bcm63xx/dev-flash.c ++++ b/arch/mips/bcm63xx/dev-flash.c +@@ -24,6 +24,8 @@ + #include <bcm63xx_regs.h> + #include <bcm63xx_io.h> +  ++int bcm63xx_attached_flash = -1; ++ + static struct mtd_partition mtd_partitions[] = { + 	{ + 		.name		= "cfe", +@@ -81,20 +83,23 @@ static int __init bcm63xx_detect_flash_t + 		bcm63xx_spi_flash_info[0].max_speed_hz = 40000000; + 		val = bcm_misc_readl(MISC_STRAPBUS_6328_REG); + 		if (val & STRAPBUS_6328_BOOT_SEL_SERIAL) +-			return BCM63XX_FLASH_TYPE_SERIAL; ++			bcm63xx_attached_flash = BCM63XX_FLASH_TYPE_SERIAL; + 		else +-			return BCM63XX_FLASH_TYPE_NAND; ++			bcm63xx_attached_flash = BCM63XX_FLASH_TYPE_NAND; ++		break; + 	case BCM6338_CPU_ID: + 	case BCM6345_CPU_ID: + 	case BCM6348_CPU_ID: + 		/* no way to auto detect so assume parallel */ +-		return BCM63XX_FLASH_TYPE_PARALLEL; ++		bcm63xx_attached_flash = BCM63XX_FLASH_TYPE_PARALLEL; ++		break; + 	case BCM6358_CPU_ID: + 		val = bcm_gpio_readl(GPIO_STRAPBUS_REG); + 		if (val & STRAPBUS_6358_BOOT_SEL_PARALLEL) +-			return BCM63XX_FLASH_TYPE_PARALLEL; ++			bcm63xx_attached_flash = BCM63XX_FLASH_TYPE_PARALLEL; + 		else +-			return BCM63XX_FLASH_TYPE_SERIAL; ++			bcm63xx_attached_flash = BCM63XX_FLASH_TYPE_SERIAL; ++		break; + 	case BCM6368_CPU_ID: + 		val = bcm_gpio_readl(GPIO_STRAPBUS_REG); + 		if (val & STRAPBUS_6368_SPI_CLK_FAST) +@@ -102,25 +107,32 @@ static int __init bcm63xx_detect_flash_t +  + 		switch (val & STRAPBUS_6368_BOOT_SEL_MASK) { + 		case STRAPBUS_6368_BOOT_SEL_NAND: +-			return BCM63XX_FLASH_TYPE_NAND; ++			bcm63xx_attached_flash = BCM63XX_FLASH_TYPE_NAND; ++			break; + 		case STRAPBUS_6368_BOOT_SEL_SERIAL: +-			return BCM63XX_FLASH_TYPE_SERIAL; ++			bcm63xx_attached_flash = BCM63XX_FLASH_TYPE_SERIAL; ++			break; + 		case STRAPBUS_6368_BOOT_SEL_PARALLEL: +-			return BCM63XX_FLASH_TYPE_PARALLEL; ++			bcm63xx_attached_flash = BCM63XX_FLASH_TYPE_PARALLEL; ++			break; ++		default: ++			return -EINVAL; + 		} + 	default: + 		return -EINVAL; + 	} ++ ++	return 0; + } +  + int __init bcm63xx_flash_register(void) + { +-	int flash_type; + 	u32 val; +  +-	flash_type = bcm63xx_detect_flash_type(); +  +-	switch (flash_type) { ++	bcm63xx_detect_flash_type(); ++ ++	switch (bcm63xx_attached_flash) { + 	case BCM63XX_FLASH_TYPE_PARALLEL: + 		/* read base address of boot chip select (0) */ + 		val = bcm_mpi_readl(MPI_CSBASE_REG(0)); +@@ -141,7 +153,7 @@ int __init bcm63xx_flash_register(void) + 		return -ENODEV; + 	default: + 		pr_err("flash detection failed for BCM%x: %d", +-		       bcm63xx_get_cpu_id(), flash_type); ++		       bcm63xx_get_cpu_id(), bcm63xx_attached_flash); + 		return -ENODEV; + 	} + } +--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h ++++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h +@@ -7,6 +7,8 @@ enum { + 	BCM63XX_FLASH_TYPE_NAND, + }; +  ++extern int bcm63xx_attached_flash; ++ + int __init bcm63xx_flash_register(void); +  + #endif /* __BCM63XX_FLASH_H */ diff --git a/target/linux/brcm63xx/patches-3.3/428-BCM63XX-add-a-fixup-for-ath9k-devices.patch b/target/linux/brcm63xx/patches-3.3/428-BCM63XX-add-a-fixup-for-ath9k-devices.patch new file mode 100644 index 000000000..42a799862 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/428-BCM63XX-add-a-fixup-for-ath9k-devices.patch @@ -0,0 +1,227 @@ +From fb6f6f58db9ae9cf27ab01f5f09cfbc5c078a7b8 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Thu, 3 May 2012 14:36:11 +0200 +Subject: [PATCH 66/80] BCM63XX: add a fixup for ath9k devices + +--- + arch/mips/bcm63xx/Makefile                         |    2 +- + arch/mips/bcm63xx/pci-ath9k-fixup.c                |  190 ++++++++++++++++++++ + .../include/asm/mach-bcm63xx/pci_ath9k_fixup.h     |    7 + + 3 files changed, 198 insertions(+), 1 deletion(-) + create mode 100644 arch/mips/bcm63xx/pci-ath9k-fixup.c + create mode 100644 arch/mips/include/asm/mach-bcm63xx/pci_ath9k_fixup.h + +--- a/arch/mips/bcm63xx/Makefile ++++ b/arch/mips/bcm63xx/Makefile +@@ -1,7 +1,7 @@ + obj-y		+= clk.o cpu.o cs.o gpio.o irq.o nvram.o prom.o setup.o \ + 		   timer.o dev-dsp.o dev-enet.o dev-flash.o dev-hsspi.o \ + 		   dev-pcmcia.o dev-spi.o dev-trng.o dev-uart.o dev-usb-ehci.o \ +-		   dev-usb-ohci.o dev-wdt.o ++		   dev-usb-ohci.o dev-wdt.o pci-ath9k-fixup.o + obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o +  + obj-y		+= boards/ +--- /dev/null ++++ b/arch/mips/bcm63xx/pci-ath9k-fixup.c +@@ -0,0 +1,190 @@ ++/* ++ *  Broadcom BCM63XX Ath9k EEPROM fixup helper. ++ * ++ *  Copytight (C) 2012 Jonas Gorski <jonas.gorski@gmail.com> ++ * ++ *  Based on ++ * ++ *  Atheros AP94 reference board PCI initialization ++ * ++ *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> ++ * ++ *  This program is free software; you can redistribute it and/or modify it ++ *  under the terms of the GNU General Public License version 2 as published ++ *  by the Free Software Foundation. ++ */ ++ ++#include <linux/pci.h> ++#include <linux/delay.h> ++#include <linux/ath9k_platform.h> ++ ++#include <bcm63xx_cpu.h> ++#include <bcm63xx_io.h> ++#include <bcm63xx_nvram.h> ++#include <bcm63xx_dev_pci.h> ++#include <bcm63xx_dev_flash.h> ++#include <bcm63xx_dev_hsspi.h> ++#include <pci_ath9k_fixup.h> ++ ++struct ath9k_fixup { ++	unsigned slot; ++	u8 mac[ETH_ALEN]; ++	struct ath9k_platform_data pdata; ++}; ++ ++static int ath9k_num_fixups; ++static struct ath9k_fixup ath9k_fixups[2] = { ++	{ ++		.slot = 255, ++		.pdata = { ++			.led_pin	= -1, ++		}, ++	}, ++	{ ++		.slot = 255, ++		.pdata = { ++			.led_pin	= -1, ++		}, ++	}, ++}; ++ ++static u16 *bcm63xx_read_eeprom(u16 *eeprom, u32 offset) ++{ ++	u32 addr; ++ ++	if (BCMCPU_IS_6328()) { ++		addr = 0x18000000; ++	} else { ++		addr = bcm_mpi_readl(MPI_CSBASE_REG(0)); ++		addr &= MPI_CSBASE_BASE_MASK; ++	} ++ ++	switch (bcm63xx_attached_flash) { ++	case BCM63XX_FLASH_TYPE_PARALLEL: ++		memcpy(eeprom, (void *)KSEG1ADDR(addr + offset), ATH9K_PLAT_EEP_MAX_WORDS * sizeof(u16)); ++		return eeprom; ++	case BCM63XX_FLASH_TYPE_SERIAL: ++		/* the first megabyte is memory mapped */ ++		if (offset < 0x100000) { ++			memcpy(eeprom, (void *)KSEG1ADDR(addr + offset), ATH9K_PLAT_EEP_MAX_WORDS * sizeof(u16)); ++			return eeprom; ++		} ++ ++		if (BCMCPU_IS_6328()) { ++			/* we can change the memory mapped megabyte */ ++			bcm_hsspi_writel(offset & 0xf00000, 0x18); ++			memcpy(eeprom, (void *)KSEG1ADDR(addr + (offset & 0xfffff)), ATH9K_PLAT_EEP_MAX_WORDS * sizeof(u16)); ++			bcm_hsspi_writel(0, 0x18); ++			return eeprom; ++		} ++		/* can't do anything here without talking to the SPI controller. */ ++	case BCM63XX_FLASH_TYPE_NAND: ++	default: ++		return NULL; ++	} ++} ++ ++static void ath9k_pci_fixup(struct pci_dev *dev) ++{ ++	void __iomem *mem; ++	struct ath9k_platform_data *pdata = NULL; ++	u16 *cal_data = NULL; ++	u16 cmd; ++	u32 bar0; ++	u32 val; ++	unsigned i; ++ ++	for (i = 0; i < ath9k_num_fixups; i++) { ++		if (ath9k_fixups[i].slot != PCI_SLOT(dev->devfn)) ++			continue; ++ ++		cal_data = ath9k_fixups[i].pdata.eeprom_data; ++		pdata = &ath9k_fixups[i].pdata; ++		break; ++	} ++ ++	if (cal_data == NULL) ++		return; ++ ++	if (*cal_data != 0xa55a) { ++		pr_err("pci %s: invalid calibration data\n", pci_name(dev)); ++		return; ++	} ++ ++	pr_info("pci %s: fixup device configuration\n", pci_name(dev)); ++ ++	switch (bcm63xx_get_cpu_id()) { ++	case BCM6328_CPU_ID: ++		val = BCM_PCIE_MEM_BASE_PA; ++		break; ++	case BCM6348_CPU_ID: ++	case BCM6358_CPU_ID: ++	case BCM6368_CPU_ID: ++		val = BCM_PCI_MEM_BASE_PA; ++		break; ++	default: ++		BUG(); ++	} ++ ++	mem = ioremap(val, 0x10000); ++	if (!mem) { ++		pr_err("pci %s: ioremap error\n", pci_name(dev)); ++		return; ++	} ++ ++	pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0); ++	pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0); ++	pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, val); ++ ++	pci_read_config_word(dev, PCI_COMMAND, &cmd); ++	cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; ++	pci_write_config_word(dev, PCI_COMMAND, cmd); ++ ++	/* set offset to first reg address */ ++	cal_data += 3; ++	while(*cal_data != 0xffff) { ++		u32 reg; ++		reg = *cal_data++; ++		val = *cal_data++; ++		val |= (*cal_data++) << 16; ++ ++		writel(val, mem + reg); ++		udelay(100); ++	} ++ ++	pci_read_config_dword(dev, PCI_VENDOR_ID, &val); ++	dev->vendor = val & 0xffff; ++	dev->device = (val >> 16) & 0xffff; ++ ++	pci_read_config_dword(dev, PCI_CLASS_REVISION, &val); ++	dev->revision = val & 0xff; ++	dev->class = val >> 8; /* upper 3 bytes */ ++ ++	pci_read_config_word(dev, PCI_COMMAND, &cmd); ++	cmd &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY); ++	pci_write_config_word(dev, PCI_COMMAND, cmd); ++ ++	pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, bar0); ++ ++	iounmap(mem); ++ ++	dev->dev.platform_data = pdata; ++} ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, ath9k_pci_fixup); ++ ++void __init pci_enable_ath9k_fixup(unsigned slot, u32 offset) ++{ ++	if (ath9k_num_fixups >= ARRAY_SIZE(ath9k_fixups)) ++		return; ++ ++	ath9k_fixups[ath9k_num_fixups].slot = slot; ++ ++	if (!bcm63xx_read_eeprom(ath9k_fixups[ath9k_num_fixups].pdata.eeprom_data, offset)) ++		return; ++ ++	if (bcm63xx_nvram_get_mac_address(ath9k_fixups[ath9k_num_fixups].mac)) ++		return; ++ ++	ath9k_fixups[ath9k_num_fixups].pdata.macaddr = ath9k_fixups[ath9k_num_fixups].mac; ++	ath9k_num_fixups++; ++} +--- /dev/null ++++ b/arch/mips/include/asm/mach-bcm63xx/pci_ath9k_fixup.h +@@ -0,0 +1,7 @@ ++#ifndef _PCI_ATH9K_FIXUP ++#define _PCI_ATH9K_FIXUP ++ ++ ++void pci_enable_ath9k_fixup(unsigned slot, u32 offset) __init; ++ ++#endif /* _PCI_ATH9K_FIXUP */ diff --git a/target/linux/brcm63xx/patches-3.3/429-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch b/target/linux/brcm63xx/patches-3.3/429-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch new file mode 100644 index 000000000..7337fa739 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/429-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch @@ -0,0 +1,118 @@ +From 8ab86c5dc38ad4de1442e50e0adbc354d9184d71 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Tue, 1 May 2012 14:38:41 +0200 +Subject: [PATCH 68/79] MTD: bcm63xxpart: allow passing a caldata offset + +Allow bcm63xxpart to receive a caldata offset if calibration data is +contained in flash. +--- + drivers/mtd/bcm63xxpart.c      |   47 ++++++++++++++++++++++++++++++++++++++-- + include/linux/mtd/partitions.h |    2 ++ + 2 files changed, 47 insertions(+), 2 deletions(-) + +--- a/drivers/mtd/bcm63xxpart.c ++++ b/drivers/mtd/bcm63xxpart.c +@@ -80,6 +80,8 @@ static int bcm63xx_parse_cfe_partitions( + 	unsigned int rootfslen, kernellen, sparelen, totallen; + 	unsigned int cfelen, nvramlen; + 	unsigned int cfe_erasesize; ++	unsigned int caldatalen1 = 0, caldataaddr1 = 0; ++	unsigned int caldatalen2 = 0, caldataaddr2 = 0; + 	int i; + 	u32 computed_crc; + 	bool rootfs_first = false; +@@ -94,6 +96,23 @@ static int bcm63xx_parse_cfe_partitions( + 	nvramlen = bcm63xx_nvram_get_psi_size() * 1024; + 	nvramlen = roundup(nvramlen, cfe_erasesize); +  ++	if (data) { ++		if (data->caldata[0]) { ++			caldatalen1 = cfe_erasesize; ++			caldataaddr1 = rounddown(data->caldata[0], ++						 cfe_erasesize); ++		} ++		if (data->caldata[1]) { ++			caldatalen2 = cfe_erasesize; ++			caldataaddr1 = rounddown(data->caldata[1], ++						 cfe_erasesize); ++		} ++		if (caldataaddr1 == caldataaddr2) { ++			caldataaddr2 = 0; ++			caldatalen2 = 0; ++		} ++	} ++ + 	/* Allocate memory for buffer */ + 	buf = vmalloc(sizeof(struct bcm_tag)); + 	if (!buf) +@@ -144,7 +163,7 @@ static int bcm63xx_parse_cfe_partitions( + 		rootfsaddr = 0; + 		spareaddr = cfelen; + 	} +-	sparelen = master->size - spareaddr - nvramlen; ++	sparelen = master->size - spareaddr - nvramlen - caldatalen1 - caldatalen2; +  + 	/* Determine number of partitions */ + 	if (rootfslen > 0) +@@ -153,6 +172,12 @@ static int bcm63xx_parse_cfe_partitions( + 	if (kernellen > 0) + 		nrparts++; +  ++	if (caldatalen1 > 0) ++		nrparts++; ++ ++	if (caldatalen2 > 0) ++		nrparts++; ++ + 	/* Ask kernel for more memory */ + 	parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL); + 	if (!parts) { +@@ -190,6 +215,23 @@ static int bcm63xx_parse_cfe_partitions( + 		curpart++; + 	} +  ++	if (caldatalen1 > 0) { ++		if (caldatalen2 > 0) ++			parts[curpart].name = "cal_data1"; ++		else ++			parts[curpart].name = "cal_data"; ++		parts[curpart].offset = caldataaddr1; ++		parts[curpart].size = caldatalen1; ++		curpart++; ++	} ++ ++	if (caldatalen2 > 0) { ++		parts[curpart].name = "cal_data2"; ++		parts[curpart].offset = caldataaddr2; ++		parts[curpart].size = caldatalen2; ++		curpart++; ++	} ++ + 	parts[curpart].name = "nvram"; + 	parts[curpart].offset = master->size - nvramlen; + 	parts[curpart].size = nvramlen; +@@ -198,7 +240,8 @@ static int bcm63xx_parse_cfe_partitions( + 	/* Global partition "linux" to make easy firmware upgrade */ + 	parts[curpart].name = "linux"; + 	parts[curpart].offset = cfelen; +-	parts[curpart].size = master->size - cfelen - nvramlen; ++	parts[curpart].size = master->size - cfelen - nvramlen ++			      - caldatalen1 - caldatalen2; +  + 	for (i = 0; i < nrparts; i++) + 		pr_info("Partition %d is %s offset %llx and length %llx\n", i, +--- a/include/linux/mtd/partitions.h ++++ b/include/linux/mtd/partitions.h +@@ -58,10 +58,12 @@ struct device_node; + /** +  * struct mtd_part_parser_data - used to pass data to MTD partition parsers. +  * @origin: for RedBoot, start address of MTD device ++ * @caldata: for CFE, start address of wifi calibration data +  * @of_node: for OF parsers, device node containing partitioning information +  */ + struct mtd_part_parser_data { + 	unsigned long origin; ++	unsigned long caldata[2]; + 	struct device_node *of_node; + }; +  diff --git a/target/linux/brcm63xx/patches-3.3/430-MIPS-BCM63XX-pass-caldata-info-to-flash.patch b/target/linux/brcm63xx/patches-3.3/430-MIPS-BCM63XX-pass-caldata-info-to-flash.patch new file mode 100644 index 000000000..a8a56f665 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.3/430-MIPS-BCM63XX-pass-caldata-info-to-flash.patch @@ -0,0 +1,82 @@ +From 977f8a30103b9c4992cab8f49357fe0d4274004f Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jonas.gorski@gmail.com> +Date: Thu, 3 May 2012 14:55:26 +0200 +Subject: [PATCH 69/80] MIPS: BCM63XX: pass caldata info to flash + +--- + arch/mips/bcm63xx/boards/board_bcm963xx.c              |    2 +- + arch/mips/bcm63xx/dev-flash.c                          |    9 ++++++++- + arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h |    4 +++- + 3 files changed, 12 insertions(+), 3 deletions(-) + +--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c ++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c +@@ -907,7 +907,7 @@ int __init board_register_devices(void) + 	if (board.num_spis) + 		spi_register_board_info(board.spis, board.num_spis); +  +-	bcm63xx_flash_register(); ++	bcm63xx_flash_register(board.has_caldata, board.caldata); +  + 	/* count number of LEDs defined by this device */ + 	while (led_count < ARRAY_SIZE(board.leds) && board.leds[led_count].name) +--- a/arch/mips/bcm63xx/dev-flash.c ++++ b/arch/mips/bcm63xx/dev-flash.c +@@ -34,12 +34,15 @@ static struct mtd_partition mtd_partitio + 	} + }; +  ++static struct mtd_part_parser_data bcm63xx_parser_data; ++ + static const char *bcm63xx_part_types[] = { "bcm63xxpart", "RedBoot", NULL }; +  + static struct physmap_flash_data flash_data = { + 	.width			= 2, + 	.parts			= mtd_partitions, + 	.part_probe_types	= bcm63xx_part_types, ++	.pp_data		= &bcm63xx_parser_data, + }; +  + static struct resource mtd_resources[] = { +@@ -61,6 +64,7 @@ static struct platform_device mtd_dev = +  + static struct flash_platform_data bcm63xx_flash_data = { + 	.part_probe_types	= bcm63xx_part_types, ++	.pp_data		= &bcm63xx_parser_data, + }; +  + static struct spi_board_info bcm63xx_spi_flash_info[] = { +@@ -125,10 +129,13 @@ static int __init bcm63xx_detect_flash_t + 	return 0; + } +  +-int __init bcm63xx_flash_register(void) ++int __init bcm63xx_flash_register(int num_caldata, struct ath9k_caldata *caldata) + { + 	u32 val; ++	unsigned int i; +  ++	for (i = 0; i < num_caldata; i++) ++		bcm63xx_parser_data.caldata[i] = caldata[i].caldata_offset; +  + 	bcm63xx_detect_flash_type(); +  +--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h ++++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h +@@ -1,6 +1,8 @@ + #ifndef __BCM63XX_FLASH_H + #define __BCM63XX_FLASH_H +  ++#include <board_bcm963xx.h> ++ + enum { + 	BCM63XX_FLASH_TYPE_PARALLEL, + 	BCM63XX_FLASH_TYPE_SERIAL, +@@ -9,6 +11,6 @@ enum { +  + extern int bcm63xx_attached_flash; +  +-int __init bcm63xx_flash_register(void); ++int __init bcm63xx_flash_register(int num_caldata, struct ath9k_caldata *caldata); +  + #endif /* __BCM63XX_FLASH_H */ diff --git a/target/linux/brcm63xx/patches-3.3/501-board-NB4.patch b/target/linux/brcm63xx/patches-3.3/501-board-NB4.patch index 9365efa7a..8a4d3928d 100644 --- a/target/linux/brcm63xx/patches-3.3/501-board-NB4.patch +++ b/target/linux/brcm63xx/patches-3.3/501-board-NB4.patch @@ -10,7 +10,7 @@   #include <asm/addrspace.h>   #include <bcm63xx_board.h>   #include <bcm63xx_cpu.h> -@@ -40,6 +43,12 @@ +@@ -42,6 +45,12 @@   #define CFE_OFFSET_64K		0x10000   #define CFE_OFFSET_128K		0x20000 @@ -20,9 +20,9 @@  +#define NB4_SPI_GPIO_CLK	6  +#define NB4_74HC64_GPIO(X)	(NB4_74X164_GPIO_BASE + (X))  + - static struct bcm963xx_nvram nvram; - static unsigned int mac_addr_used;   static struct board_info board; +  + /*  @@ -666,6 +675,496 @@ static struct board_info __initdata boar   	.has_ohci0			= 1, @@ -520,7 +520,7 @@   #endif   /* -@@ -696,9 +1195,30 @@ static const struct board_info __initdat +@@ -696,9 +1195,31 @@ static const struct board_info __initdat   	&board_96358vw2,   	&board_AGPFS0,   	&board_DWVS0, @@ -536,28 +536,29 @@  +{  +	u8 *boot_addr, *p;  +	u32 val; ++	char *board_name = (char *)bcm63xx_nvram_get_name();  + -+	if (BCMCPU_IS_6358() && (!strcmp(nvram.name, "96358VW"))) { ++	if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {  +		val = bcm_mpi_readl(MPI_CSBASE_REG(0));  +		val &= MPI_CSBASE_BASE_MASK;  +		boot_addr = (u8 *)KSEG1ADDR(val);  +		/* Extract nb4 PID */  +		p = boot_addr + NB4_PID_OFFSET;  +		if (!memcmp(p, "NB4-", 4)) -+			memcpy(nvram.name, p, sizeof("NB4-XXX-rX")); ++			memcpy(board_name, p, sizeof("NB4-XXX-rX"));  +	}  +}  +   /*    * Register a sane SPROMv2 to make the on-board    * bcm4318 WLAN work -@@ -854,6 +1374,9 @@ void __init board_prom_init(void) +@@ -807,6 +1328,9 @@ void __init board_prom_init(void)   		boardid_fixup(boot_addr);   	}  +	/* Fixup broken nb4 board name */  +	nb4_nvram_fixup();  + + 	board_name = bcm63xx_nvram_get_name();   	/* find board by name */   	for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) { - 		if (strncmp(nvram.name, bcm963xx_boards[i]->name, diff --git a/target/linux/brcm63xx/patches-3.3/511-board_V2500V.patch b/target/linux/brcm63xx/patches-3.3/511-board_V2500V.patch index e299cc6db..96342f79a 100644 --- a/target/linux/brcm63xx/patches-3.3/511-board_V2500V.patch +++ b/target/linux/brcm63xx/patches-3.3/511-board_V2500V.patch @@ -72,7 +72,7 @@   #endif   #ifdef CONFIG_BCM63XX_CPU_6358 -@@ -1944,6 +2002,22 @@ void __init board_prom_init(void) +@@ -1912,6 +1970,23 @@ void __init board_prom_init(void)   		val &= MPI_CSBASE_BASE_MASK;   	}   	boot_addr = (u8 *)KSEG1ADDR(val); @@ -83,11 +83,12 @@  +	/* Loading firmware from the CFE Prompt always loads to Bank 0 */  +	/* Do an early check of CFE and then select bank 0 */  + -+       	if (boot_addr == (u8 *)0xbf800000) { ++	if (boot_addr == (u8 *)0xbf800000) { ++		unsigned char board_name[16];  +		u8 *tmp_boot_addr;  +		tmp_boot_addr = (u8 *)0xbfc00000; // Address of Bank 0 -+		memcpy(&nvram, tmp_boot_addr + BCM963XX_NVRAM_OFFSET, sizeof(nvram)); -+		if (!strcmp(nvram.name, "V2500V_BB")) { ++		memcpy(board_name, tmp_boot_addr + BCM963XX_NVRAM_OFFSET + offsetof(struct bcm963xx_nvram, name), sizeof(board_name)); ++		if (!strcmp(board_name, "V2500V_BB")) {  +	               	printk(KERN_INFO PFX "V2500V: nvram bank 0\n");  +			boot_addr = (u8 *)0xbfc00000; // Bank 0  +		} @@ -105,7 +106,7 @@   #include <bcm63xx_cpu.h>   #include <bcm63xx_dev_flash.h>   #include <bcm63xx_dev_hsspi.h> -@@ -126,6 +127,13 @@ int __init bcm63xx_flash_register(void) +@@ -145,6 +146,13 @@ int __init bcm63xx_flash_register(int nu   		val = bcm_mpi_readl(MPI_CSBASE_REG(0));   		val &= MPI_CSBASE_BASE_MASK; diff --git a/target/linux/brcm63xx/patches-3.3/520-bcm63xx-add-support-for-96368MVWG-board.patch b/target/linux/brcm63xx/patches-3.3/520-bcm63xx-add-support-for-96368MVWG-board.patch index bd8d524ec..7ca4c5407 100644 --- a/target/linux/brcm63xx/patches-3.3/520-bcm63xx-add-support-for-96368MVWG-board.patch +++ b/target/linux/brcm63xx/patches-3.3/520-bcm63xx-add-support-for-96368MVWG-board.patch @@ -102,7 +102,7 @@ Subject: [PATCH 32/63] bcm63xx: add support for 96368MVWG board.   };   static void __init nb4_nvram_fixup(void) -@@ -2286,12 +2364,25 @@ void __init board_prom_init(void) +@@ -2242,12 +2320,25 @@ void __init board_prom_init(void)   	if (board.has_pci) {   		if (BCMCPU_IS_6348())   			val |= GPIO_MODE_6348_G2_PCI; diff --git a/target/linux/brcm63xx/patches-3.3/550-alice_gate2_leds.patch b/target/linux/brcm63xx/patches-3.3/550-alice_gate2_leds.patch index e82d0562a..791728723 100644 --- a/target/linux/brcm63xx/patches-3.3/550-alice_gate2_leds.patch +++ b/target/linux/brcm63xx/patches-3.3/550-alice_gate2_leds.patch @@ -102,7 +102,7 @@   static struct board_info __initdata board_DWVS0 = {  --- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h  +++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h -@@ -59,7 +59,7 @@ struct board_info { +@@ -52,7 +52,7 @@ struct board_info {   	struct bcm63xx_dsp_platform_data dsp;   	/* GPIO LEDs */ diff --git a/target/linux/brcm63xx/patches-3.3/800-wl_exports.patch b/target/linux/brcm63xx/patches-3.3/800-wl_exports.patch index 2b4c97ee3..fd242f6a4 100644 --- a/target/linux/brcm63xx/patches-3.3/800-wl_exports.patch +++ b/target/linux/brcm63xx/patches-3.3/800-wl_exports.patch @@ -1,32 +1,24 @@ ---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c -+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c -@@ -14,6 +14,7 @@ - #include <linux/ssb/ssb.h> - #include <linux/gpio_keys.h> - #include <linux/input.h> -+#include <linux/export.h> - #include <linux/spi/spi.h> - #include <linux/spi/spi_gpio.h> - #include <linux/spi/74x164.h> -@@ -54,6 +55,13 @@ static unsigned int mac_addr_used; - static struct board_info board; +--- a/arch/mips/bcm63xx/nvram.c ++++ b/arch/mips/bcm63xx/nvram.c +@@ -19,6 +19,13 @@ + static struct bcm963xx_nvram nvram; + static int mac_addr_used; - /* ++/*  + * Required export for WL  + */  +#define NVRAM_SPACE 0x8000  +char nvram_buf[NVRAM_SPACE];  +EXPORT_SYMBOL(nvram_buf);  + -+/* -  * known 6338 boards -  */ - #ifdef CONFIG_BCM63XX_CPU_6338 -@@ -2496,6 +2504,7 @@ void __init board_prom_init(void) + int __init bcm63xx_nvram_init(void *addr) + { + 	unsigned int check_len; +@@ -27,6 +34,7 @@ int __init bcm63xx_nvram_init(void *addr   	/* extract nvram data */ - 	memcpy(&nvram, boot_addr + BCM963XX_NVRAM_OFFSET, sizeof(nvram)); -+	memcpy(&nvram_buf, boot_addr + BCM963XX_NVRAM_OFFSET, NVRAM_SPACE); + 	memcpy(&nvram, addr, sizeof(nvram)); ++	memcpy(&nvram_buf, addr, NVRAM_SPACE);   	/* check checksum before using data */   	if (nvram.version <= 4) diff --git a/target/linux/brcm63xx/patches-3.3/801-ssb_export_fallback_sprom.patch b/target/linux/brcm63xx/patches-3.3/801-ssb_export_fallback_sprom.patch index 5d68606c8..025edf4b3 100644 --- a/target/linux/brcm63xx/patches-3.3/801-ssb_export_fallback_sprom.patch +++ b/target/linux/brcm63xx/patches-3.3/801-ssb_export_fallback_sprom.patch @@ -1,6 +1,14 @@  --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c  +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c -@@ -2358,7 +2358,7 @@ static void __init nb4_nvram_fixup(void) +@@ -14,6 +14,7 @@ + #include <linux/ssb/ssb.h> + #include <linux/gpio_keys.h> + #include <linux/input.h> ++#include <linux/export.h> + #include <linux/spi/spi.h> + #include <linux/spi/spi_gpio.h> + #include <linux/spi/74x164.h> +@@ -2351,7 +2352,7 @@ static void __init nb4_nvram_fixup(void)    * bcm4318 WLAN work    */   #ifdef CONFIG_SSB_PCIHOST @@ -9,7 +17,7 @@   	.revision		= 0x02,   	.board_rev		= 0x17,   	.country_code		= 0x0, -@@ -2378,6 +2378,7 @@ static struct ssb_sprom bcm63xx_sprom = +@@ -2371,6 +2372,7 @@ static struct ssb_sprom bcm63xx_sprom =   	.boardflags_lo		= 0x2848,   	.boardflags_hi		= 0x0000,   }; | 
