aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx/patches-2.6.37/034-bcm47xx-extend-and-fix-fill-sprom.patch
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2011-05-01 20:28:35 +0000
committerHauke Mehrtens <hauke@hauke-m.de>2011-05-01 20:28:35 +0000
commit3dbb8c508869d29076284ae01dbbaa9450dcf6d6 (patch)
treed0cf963c310ad56cef3b2cc816928de3f85c3b33 /target/linux/brcm47xx/patches-2.6.37/034-bcm47xx-extend-and-fix-fill-sprom.patch
parent28fb716737c4d45d977d2d19c3d9d73b781b7597 (diff)
downloadupstream-3dbb8c508869d29076284ae01dbbaa9450dcf6d6.tar.gz
upstream-3dbb8c508869d29076284ae01dbbaa9450dcf6d6.tar.bz2
upstream-3dbb8c508869d29076284ae01dbbaa9450dcf6d6.zip
brcm47xx: add fallback sprom for pci devices without an own sprom.
If there is no sprom on an ssb based pci device on the brcm47xx architecture ssb now asks the architecture code to look into the nvram to get some sprom data for this device. Now we are able to read out pci/1/1/ foo or pci/1/3/ foo config options. This will fix some problems where the wireless devices does not got an mac address and the following message was show: ssb: WARNING: Invalid SPROM CRC (corrupt SPROM) SVN-Revision: 26801
Diffstat (limited to 'target/linux/brcm47xx/patches-2.6.37/034-bcm47xx-extend-and-fix-fill-sprom.patch')
-rw-r--r--target/linux/brcm47xx/patches-2.6.37/034-bcm47xx-extend-and-fix-fill-sprom.patch122
1 files changed, 122 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-2.6.37/034-bcm47xx-extend-and-fix-fill-sprom.patch b/target/linux/brcm47xx/patches-2.6.37/034-bcm47xx-extend-and-fix-fill-sprom.patch
new file mode 100644
index 0000000000..490ca67bdb
--- /dev/null
+++ b/target/linux/brcm47xx/patches-2.6.37/034-bcm47xx-extend-and-fix-fill-sprom.patch
@@ -0,0 +1,122 @@
+--- a/arch/mips/bcm47xx/setup.c
++++ b/arch/mips/bcm47xx/setup.c
+@@ -62,6 +62,11 @@ static void bcm47xx_machine_halt(void)
+ if (nvram_getprefix(prefix, name, buf, sizeof(buf)) >= 0)\
+ sprom->_outvar = simple_strtoul(buf, NULL, 0);
+
++#define READ_FROM_NVRAM2(_outvar, name1, name2, buf) \
++ if (nvram_getprefix(prefix, name1, buf, sizeof(buf)) >= 0 || \
++ nvram_getprefix(prefix, name2, buf, sizeof(buf)) >= 0)\
++ sprom->_outvar = simple_strtoul(buf, NULL, 0);
++
+ static inline int nvram_getprefix(const char *prefix, char *name,
+ char *buf, int len)
+ {
+@@ -75,6 +80,27 @@ static inline int nvram_getprefix(const
+ return nvram_getenv(name, buf, len);
+ }
+
++static u32 nvram_getu32(const char *name, char *buf, int len)
++{
++ int rv;
++ char key[100];
++ u16 var0, var1;
++
++ snprintf(key, sizeof(key), "%s0", name);
++ rv = nvram_getenv(key, buf, len);
++ /* return 0 here so this looks like unset */
++ if (rv < 0)
++ return 0;
++ var0 = simple_strtoul(buf, NULL, 0);
++
++ snprintf(key, sizeof(key), "%s1", name);
++ rv = nvram_getenv(key, buf, len);
++ if (rv < 0)
++ return 0;
++ var1 = simple_strtoul(buf, NULL, 0);
++ return var1 << 16 | var0;
++}
++
+ static void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix)
+ {
+ char buf[100];
+@@ -84,7 +110,8 @@ static void bcm47xx_fill_sprom(struct ss
+
+ sprom->revision = 1; /* Fallback: Old hardware does not define this. */
+ READ_FROM_NVRAM(revision, "sromrev", buf);
+- if (nvram_getprefix(prefix, "il0macaddr", buf, sizeof(buf)) >= 0)
++ if (nvram_getprefix(prefix, "il0macaddr", buf, sizeof(buf)) >= 0 ||
+++ nvram_getprefix(prefix, "macaddr", buf, sizeof(buf)) >= 0)
+ nvram_parse_macaddr(buf, sprom->il0mac);
+ if (nvram_getprefix(prefix, "et0macaddr", buf, sizeof(buf)) >= 0)
+ nvram_parse_macaddr(buf, sprom->et0mac);
+@@ -110,20 +137,36 @@ static void bcm47xx_fill_sprom(struct ss
+ READ_FROM_NVRAM(pa1hib0, "pa1hib0", buf);
+ READ_FROM_NVRAM(pa1hib2, "pa1hib1", buf);
+ READ_FROM_NVRAM(pa1hib1, "pa1hib2", buf);
+- READ_FROM_NVRAM(gpio0, "wl0gpio0", buf);
+- READ_FROM_NVRAM(gpio1, "wl0gpio1", buf);
+- READ_FROM_NVRAM(gpio2, "wl0gpio2", buf);
+- READ_FROM_NVRAM(gpio3, "wl0gpio3", buf);
+- READ_FROM_NVRAM(maxpwr_bg, "pa0maxpwr", buf);
+- READ_FROM_NVRAM(maxpwr_al, "pa1lomaxpwr", buf);
+- READ_FROM_NVRAM(maxpwr_a, "pa1maxpwr", buf);
+- READ_FROM_NVRAM(maxpwr_ah, "pa1himaxpwr", buf);
+- READ_FROM_NVRAM(itssi_a, "pa1itssit", buf);
+- READ_FROM_NVRAM(itssi_bg, "pa0itssit", buf);
++ READ_FROM_NVRAM2(gpio0, "ledbh0", "wl0gpio0", buf);
++ READ_FROM_NVRAM2(gpio1, "ledbh1", "wl0gpio1", buf);
++ READ_FROM_NVRAM2(gpio2, "ledbh2", "wl0gpio2", buf);
++ READ_FROM_NVRAM2(gpio3, "ledbh3", "wl0gpio3", buf);
++ READ_FROM_NVRAM2(maxpwr_bg, "maxp2ga0", "pa0maxpwr", buf);
++ READ_FROM_NVRAM2(maxpwr_al, "maxp5gla0", "pa1lomaxpwr", buf);
++ READ_FROM_NVRAM2(maxpwr_a, "maxp5ga0", "pa1maxpwr", buf);
++ READ_FROM_NVRAM2(maxpwr_ah, "maxp5gha0", "pa1himaxpwr", buf);
++ READ_FROM_NVRAM2(itssi_bg, "itt5ga0", "pa0itssit", buf);
++ READ_FROM_NVRAM2(itssi_a, "itt2ga0", "pa1itssit", buf);
+ READ_FROM_NVRAM(tri2g, "tri2g", buf);
+ READ_FROM_NVRAM(tri5gl, "tri5gl", buf);
+ READ_FROM_NVRAM(tri5g, "tri5g", buf);
+ READ_FROM_NVRAM(tri5gh, "tri5gh", buf);
++ READ_FROM_NVRAM(txpid2g[0], "txpid2ga0", buf);
++ READ_FROM_NVRAM(txpid2g[1], "txpid2ga1", buf);
++ READ_FROM_NVRAM(txpid2g[2], "txpid2ga2", buf);
++ READ_FROM_NVRAM(txpid2g[3], "txpid2ga3", buf);
++ READ_FROM_NVRAM(txpid5g[0], "txpid5ga0", buf);
++ READ_FROM_NVRAM(txpid5g[1], "txpid5ga1", buf);
++ READ_FROM_NVRAM(txpid5g[2], "txpid5ga2", buf);
++ READ_FROM_NVRAM(txpid5g[3], "txpid5ga3", buf);
++ READ_FROM_NVRAM(txpid5gl[0], "txpid5gla0", buf);
++ READ_FROM_NVRAM(txpid5gl[1], "txpid5gla1", buf);
++ READ_FROM_NVRAM(txpid5gl[2], "txpid5gla2", buf);
++ READ_FROM_NVRAM(txpid5gl[3], "txpid5gla3", buf);
++ READ_FROM_NVRAM(txpid5gh[0], "txpid5gha0", buf);
++ READ_FROM_NVRAM(txpid5gh[1], "txpid5gha1", buf);
++ READ_FROM_NVRAM(txpid5gh[2], "txpid5gha2", buf);
++ READ_FROM_NVRAM(txpid5gh[3], "txpid5gha3", buf);
+ READ_FROM_NVRAM(rxpo2g, "rxpo2g", buf);
+ READ_FROM_NVRAM(rxpo5g, "rxpo5g", buf);
+ READ_FROM_NVRAM(rssisav2g, "rssisav2g", buf);
+@@ -135,10 +178,18 @@ static void bcm47xx_fill_sprom(struct ss
+ READ_FROM_NVRAM(rssismf5g, "rssismf5g", buf);
+ READ_FROM_NVRAM(bxa5g, "bxa5g", buf);
+ READ_FROM_NVRAM(cck2gpo, "cck2gpo", buf);
+- READ_FROM_NVRAM(ofdm2gpo, "ofdm2gpo", buf);
+- READ_FROM_NVRAM(ofdm5glpo, "ofdm5glpo", buf);
+- READ_FROM_NVRAM(ofdm5gpo, "ofdm5gpo", buf);
+- READ_FROM_NVRAM(ofdm5ghpo, "ofdm5ghpo", buf);
++
++ sprom->ofdm2gpo = nvram_getu32("ofdm2gpo", buf, sizeof(buf));
++ sprom->ofdm5glpo = nvram_getu32("ofdm5glpo", buf, sizeof(buf));
++ sprom->ofdm5gpo = nvram_getu32("ofdm5gpo", buf, sizeof(buf));
++ sprom->ofdm5ghpo = nvram_getu32("ofdm5ghpo", buf, sizeof(buf));
++
++ READ_FROM_NVRAM(antenna_gain.ghz24.a0, "ag0", buf);
++ READ_FROM_NVRAM(antenna_gain.ghz24.a1, "ag1", buf);
++ READ_FROM_NVRAM(antenna_gain.ghz24.a2, "ag2", buf);
++ READ_FROM_NVRAM(antenna_gain.ghz24.a3, "ag3", buf);
++ memcpy(&sprom->antenna_gain.ghz5, &sprom->antenna_gain.ghz24,
++ sizeof(sprom->antenna_gain.ghz5));
+
+ if (nvram_getprefix(prefix, "boardflags", buf, sizeof(buf)) >= 0) {
+ boardflags = simple_strtoul(buf, NULL, 0);