bcm63xx: add a fixup for ath9k devices
SVN-Revision: 31880
This commit is contained in:
parent
e34018cc9e
commit
e19ed52fd1
23 changed files with 1447 additions and 63 deletions
|
@ -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++;
|
||||
}
|
||||
|
|
@ -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);
|
|
@ -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)
|
|
@ -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));
|
|
@ -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;
|
|
@ -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);
|
|
@ -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",
|
||||
|
|
|
@ -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 {
|
|
@ -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 */
|
|
@ -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));
|
|
@ -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__ */
|
|
@ -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;
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -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 */
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue