openwrt/target/linux/brcm47xx/patches-2.6.35/012-MIPS-BCM47xx-Fill-more-...

162 lines
6.9 KiB
Diff
Raw Normal View History

From 493d4a90850509e5f09b4799d4fc234b734a9d30 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Sun, 18 Jul 2010 13:34:32 +0200
Subject: [PATCH 2/5] MIPS: BCM47xx: Fill more values into ssb sprom
Most of the values are stored in the nvram and not in the CFE. At first
the nvram should be read and if there is no value it should look into
the CFE. Now more values are read out because the b43 and b43legacy
drivers needs them.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
arch/mips/bcm47xx/setup.c | 125 +++++++++++++++++++++++++++++++++------------
1 files changed, 92 insertions(+), 33 deletions(-)
--- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c
@@ -74,6 +74,89 @@ static void str2eaddr(char *str, char *d
}
}
+static void bcm47xx_fill_sprom(struct ssb_sprom *sprom)
+{
+ char buf[100];
+ u64 boardflags;
+
+ memset(sprom, 0, sizeof(struct ssb_sprom));
+
+ sprom->revision = 3;
+ if (nvram_getenv("il0macaddr", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("il0macaddr", buf, sizeof(buf)) >= 0)
+ str2eaddr(buf, sprom->il0mac);
+ if (nvram_getenv("et0macaddr", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0)
+ str2eaddr(buf, sprom->et0mac);
+ if (nvram_getenv("et1macaddr", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0)
+ str2eaddr(buf, sprom->et1mac);
+ if (nvram_getenv("et0phyaddr", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0)
+ sprom->et0phyaddr = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("et1phyaddr", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0)
+ sprom->et1phyaddr = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("et0mdcport", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0)
+ sprom->et0mdcport = !!simple_strtoul(buf, NULL, 10);
+ if (nvram_getenv("et1mdcport", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0)
+ sprom->et1mdcport = !!simple_strtoul(buf, NULL, 10);
+ if (nvram_getenv("pa0b0", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa0b0", buf, sizeof(buf)) >= 0)
+ sprom->pa0b0 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa0b1", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa0b1", buf, sizeof(buf)) >= 0)
+ sprom->pa0b1 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa0b2", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa0b2", buf, sizeof(buf)) >= 0)
+ sprom->pa0b2 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa1b0", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa1b0", buf, sizeof(buf)) >= 0)
+ sprom->pa1b0 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa1b1", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa1b1", buf, sizeof(buf)) >= 0)
+ sprom->pa1b1 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa1b2", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa1b2", buf, sizeof(buf)) >= 0)
+ sprom->pa1b2 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("wl0gpio0", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("wl0gpio0", buf, sizeof(buf)) >= 0)
+ sprom->gpio0 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("wl0gpio1", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("wl0gpio1", buf, sizeof(buf)) >= 0)
+ sprom->gpio1 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("wl0gpio2", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("wl0gpio2", buf, sizeof(buf)) >= 0)
+ sprom->gpio2 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("wl0gpio3", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("wl0gpio3", buf, sizeof(buf)) >= 0)
+ sprom->gpio3 = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa0maxpwr", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa0maxpwr", buf, sizeof(buf)) >= 0)
+ sprom->maxpwr_bg = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa1maxpwr", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa1maxpwr", buf, sizeof(buf)) >= 0)
+ sprom->maxpwr_a = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa0itssit", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa0itssit", buf, sizeof(buf)) >= 0)
+ sprom->itssi_bg = simple_strtoul(buf, NULL, 0);
+ if (nvram_getenv("pa1itssit", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("pa1itssit", buf, sizeof(buf)) >= 0)
+ sprom->itssi_a = simple_strtoul(buf, NULL, 0);
+
+ if (nvram_getenv("boardflags", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("boardflags", buf, sizeof(buf)) >= 0)
+ boardflags = simple_strtoll(buf, NULL, 0);
+ if (boardflags) {
+ sprom->boardflags_lo = (boardflags & 0x000000000000FFFFLLU);
+ sprom->boardflags_hi = (boardflags & 0x00000000FFFF0000LLU) >> 16;
+ sprom->boardflags2_lo = (boardflags & 0x0000FFFF00000000LLU) >> 32;
+ sprom->boardflags2_hi = (boardflags & 0xFFFF000000000000LLU) >> 48;
+ }
+}
+
static int bcm47xx_get_invariants(struct ssb_bus *bus,
struct ssb_init_invariants *iv)
{
@@ -82,43 +165,19 @@ static int bcm47xx_get_invariants(struct
/* Fill boardinfo structure */
memset(&(iv->boardinfo), 0 , sizeof(struct ssb_boardinfo));
- if (cfe_getenv("boardvendor", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("boardvendor", buf, sizeof(buf)) >= 0)
+ iv->boardinfo.vendor = SSB_BOARDVENDOR_BCM;
+ if (nvram_getenv("boardtype", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("boardtype", buf, sizeof(buf)) >= 0)
iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0);
- if (cfe_getenv("boardtype", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("boardtype", buf, sizeof(buf)) >= 0)
- iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0);
- if (cfe_getenv("boardrev", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("boardrev", buf, sizeof(buf)) >= 0)
+ if (nvram_getenv("boardrev", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("boardrev", buf, sizeof(buf)) >= 0)
iv->boardinfo.rev = (u16)simple_strtoul(buf, NULL, 0);
- /* Fill sprom structure */
- memset(&(iv->sprom), 0, sizeof(struct ssb_sprom));
- iv->sprom.revision = 3;
-
- if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("et0macaddr", buf, sizeof(buf)) >= 0)
- str2eaddr(buf, iv->sprom.et0mac);
-
- if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("et1macaddr", buf, sizeof(buf)) >= 0)
- str2eaddr(buf, iv->sprom.et1mac);
-
- if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("et0phyaddr", buf, sizeof(buf)) >= 0)
- iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 0);
-
- if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("et1phyaddr", buf, sizeof(buf)) >= 0)
- iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 0);
-
- if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("et0mdcport", buf, sizeof(buf)) >= 0)
- iv->sprom.et0mdcport = simple_strtoul(buf, NULL, 10);
-
- if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0 ||
- nvram_getenv("et1mdcport", buf, sizeof(buf)) >= 0)
- iv->sprom.et1mdcport = simple_strtoul(buf, NULL, 10);
+ bcm47xx_fill_sprom(&iv->sprom);
+
+ if (nvram_getenv("cardbus", buf, sizeof(buf)) >= 0 ||
+ cfe_getenv("cardbus", buf, sizeof(buf)) >= 0)
+ iv->has_cardbus_slot = !!simple_strtoul(buf, NULL, 10);
return 0;
}