bcm63xx: add a fixup for ath9k devices
authorJonas Gorski <jogo@openwrt.org>
Sun, 27 May 2012 13:22:37 +0000 (13:22 +0000)
committerJonas Gorski <jogo@openwrt.org>
Sun, 27 May 2012 13:22:37 +0000 (13:22 +0000)
SVN-Revision: 31880

23 files changed:
target/linux/brcm63xx/patches-3.3/012-mtd-bcm63xxpart-handle-Broadcom-partition-order.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/101-MTD-bcm63xxpart-remove-unused-variable.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/102-MTD-bcm63xxpart-merge-sparelen-calculation.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/103-MTD-bcm63xxpart-make-fixed-part-length-calculation-m.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/104-MTD-bcm63xxpart-move-the-last-curpart-to-its-correct.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/105-MTD-bcm63xxpart-use-correct-printk-format-for-partit.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/405-bcm963xx_real_rootfs_length.patch
target/linux/brcm63xx/patches-3.3/421-MIPS-BCM63XX-move-nvram-related-functions-into-their.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/422-MIPS-BCM63XX-export-PSI-size-from-nvram.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/423-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/424-MTD-physmap-allow-passing-pp_data.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/425-BCM63XX-allow-providing-fixup-data-in-board-data.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/426-MTD-m25p80-allow-passing-pp_data.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/427-MTD-m25p80-allow-passing-pp_data.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/428-BCM63XX-add-a-fixup-for-ath9k-devices.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/429-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/430-MIPS-BCM63XX-pass-caldata-info-to-flash.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.3/501-board-NB4.patch
target/linux/brcm63xx/patches-3.3/511-board_V2500V.patch
target/linux/brcm63xx/patches-3.3/520-bcm63xx-add-support-for-96368MVWG-board.patch
target/linux/brcm63xx/patches-3.3/550-alice_gate2_leds.patch
target/linux/brcm63xx/patches-3.3/800-wl_exports.patch
target/linux/brcm63xx/patches-3.3/801-ssb_export_fallback_sprom.patch

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 (file)
index 0000000..b12aed6
--- /dev/null
@@ -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 (file)
index 0000000..470f966
--- /dev/null
@@ -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 (file)
index 0000000..da24b1b
--- /dev/null
@@ -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 (file)
index 0000000..ca0cddd
--- /dev/null
@@ -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 (file)
index 0000000..8e05803
--- /dev/null
@@ -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 (file)
index 0000000..60396ab
--- /dev/null
@@ -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);
index 0476699edbaf72ee4b2c10b2d229ea2d14df4e39..856b9e2674a36bc5aa70b508f4155d5f06b54501 100644 (file)
        /* 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 (file)
index 0000000..bc00967
--- /dev/null
@@ -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 (file)
index 0000000..34966b2
--- /dev/null
@@ -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 (file)
index 0000000..5ca6f47
--- /dev/null
@@ -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 (file)
index 0000000..f869911
--- /dev/null
@@ -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 (file)
index 0000000..d408505
--- /dev/null
@@ -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 (file)
index 0000000..bda4807
--- /dev/null
@@ -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 (file)
index 0000000..51836f5
--- /dev/null
@@ -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 (file)
index 0000000..42a7998
--- /dev/null
@@ -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 (file)
index 0000000..7337fa7
--- /dev/null
@@ -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 (file)
index 0000000..a8a56f6
--- /dev/null
@@ -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 */
index 9365efa7a65bb4fda938c30f6d6951d9c21b606c..8a4d3928d8cb2345f695f58963f58e73d8f00a78 100644 (file)
@@ -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,
  #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,
 +{
 +      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,
index e299cc6dba1f238740cd97f006c16f9d2ac7a59b..96342f79a86c4ec5d1b83b143c752fc96867b15d 100644 (file)
@@ -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);
 +      /* 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
 +              }
  #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;
  
index bd8d524eca4f08f892488d3b89dfa578c2df494d..7ca4c540796225f63c0b550f72474f3f5af9616c 100644 (file)
@@ -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;
index e82d0562a9d2ea4b092d2686582a7dcb23ccb768..7917287235d721642e3bd6d70f5a76cb62215d1e 100644 (file)
  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 */
index 2b4c97ee3c3dfd8b994541c2489044c0039a3b2a..fd242f6a4f965da843cb20b50c5b98985f378e4b 100644 (file)
@@ -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)
index 5d68606c82acf935c4779836062ab38a4db6f6e1..025edf4b359dbd917d3bbfc21f77bb4e234410a6 100644 (file)
@@ -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,
  };