summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx/patches-3.2/0043-bcma-add-extra-sprom-check.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm47xx/patches-3.2/0043-bcma-add-extra-sprom-check.patch')
-rw-r--r--target/linux/brcm47xx/patches-3.2/0043-bcma-add-extra-sprom-check.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-3.2/0043-bcma-add-extra-sprom-check.patch b/target/linux/brcm47xx/patches-3.2/0043-bcma-add-extra-sprom-check.patch
new file mode 100644
index 000000000..0dd196815
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.2/0043-bcma-add-extra-sprom-check.patch
@@ -0,0 +1,63 @@
+From 1cd3d0de72e42161fe0df355c5429459265aeef0 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Sat, 14 Jan 2012 16:11:17 +0100
+Subject: [PATCH 30/32] bcma: add extra sprom check
+
+This check is needed on the BCM43224 device as it says in the
+capabilities it has an sprom but is extra check says it has not.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ drivers/bcma/sprom.c | 8 ++++++++
+ include/linux/bcma/bcma_driver_chipcommon.h | 16 ++++++++++++++++
+ 2 files changed, 24 insertions(+), 0 deletions(-)
+
+--- a/drivers/bcma/sprom.c
++++ b/drivers/bcma/sprom.c
+@@ -210,6 +210,7 @@ int bcma_sprom_get(struct bcma_bus *bus)
+ {
+ u16 offset;
+ u16 *sprom;
++ u32 sromctrl;
+ int err = 0;
+
+ if (!bus->drv_cc.core)
+@@ -220,6 +221,13 @@ int bcma_sprom_get(struct bcma_bus *bus)
+ return -ENOENT;
+ }
+
++ if (bus->drv_cc.core->id.rev >= 32) {
++ sromctrl = bcma_read32(bus->drv_cc.core, BCMA_CC_SROM_CONTROL);
++ if (!(sromctrl & BCMA_CC_SROM_CONTROL_PRESENT))
++ random_ether_addr(bus->sprom.il0mac);
++ return -ENOENT;
++ }
++
+ sprom = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
+ GFP_KERNEL);
+ if (!sprom)
+--- a/include/linux/bcma/bcma_driver_chipcommon.h
++++ b/include/linux/bcma/bcma_driver_chipcommon.h
+@@ -239,6 +239,22 @@
+ #define BCMA_CC_FLASH_CFG 0x0128
+ #define BCMA_CC_FLASH_CFG_DS 0x0010 /* Data size, 0=8bit, 1=16bit */
+ #define BCMA_CC_FLASH_WAITCNT 0x012C
++#define BCMA_CC_SROM_CONTROL 0x0190
++#define BCMA_CC_SROM_CONTROL_START 0x80000000
++#define BCMA_CC_SROM_CONTROL_BUSY 0x80000000
++#define BCMA_CC_SROM_CONTROL_OPCODE 0x60000000
++#define BCMA_CC_SROM_CONTROL_OP_READ 0x00000000
++#define BCMA_CC_SROM_CONTROL_OP_WRITE 0x20000000
++#define BCMA_CC_SROM_CONTROL_OP_WRDIS 0x40000000
++#define BCMA_CC_SROM_CONTROL_OP_WREN 0x60000000
++#define BCMA_CC_SROM_CONTROL_OTPSEL 0x00000010
++#define BCMA_CC_SROM_CONTROL_LOCK 0x00000008
++#define BCMA_CC_SROM_CONTROL_SIZE_MASK 0x00000006
++#define BCMA_CC_SROM_CONTROL_SIZE_1K 0x00000000
++#define BCMA_CC_SROM_CONTROL_SIZE_4K 0x00000002
++#define BCMA_CC_SROM_CONTROL_SIZE_16K 0x00000004
++#define BCMA_CC_SROM_CONTROL_SIZE_SHIFT 1
++#define BCMA_CC_SROM_CONTROL_PRESENT 0x00000001
+ /* 0x1E0 is defined as shared BCMA_CLKCTLST */
+ #define BCMA_CC_HW_WORKAROUND 0x01E4 /* Hardware workaround (rev >= 20) */
+ #define BCMA_CC_UART0_DATA 0x0300