source: trunk/target/linux/brcm47xx/patches-2.6.38/034-bcm47xx-extend-and-fix-fill-sprom.patch @ 26801

Last change on this file since 26801 was 26801, checked in by hauke, 5 years ago

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)

File size: 5.1 KB
  • arch/mips/bcm47xx/setup.c

    a b static void bcm47xx_machine_halt(void) 
    6262        if (nvram_getprefix(prefix, name, buf, sizeof(buf)) >= 0)\ 
    6363                sprom->_outvar = simple_strtoul(buf, NULL, 0); 
    6464 
     65#define READ_FROM_NVRAM2(_outvar, name1, name2, buf) \ 
     66        if (nvram_getprefix(prefix, name1, buf, sizeof(buf)) >= 0 || \ 
     67            nvram_getprefix(prefix, name2, buf, sizeof(buf)) >= 0)\ 
     68                sprom->_outvar = simple_strtoul(buf, NULL, 0); 
     69 
    6570static inline int nvram_getprefix(const char *prefix, char *name, 
    6671                                  char *buf, int len) 
    6772{ 
    static inline int nvram_getprefix(const 
    7580        return nvram_getenv(name, buf, len); 
    7681} 
    7782 
     83static u32 nvram_getu32(const char *name, char *buf, int len) 
     84{ 
     85        int rv; 
     86        char key[100]; 
     87        u16 var0, var1; 
     88 
     89        snprintf(key, sizeof(key), "%s0", name); 
     90        rv = nvram_getenv(key, buf, len); 
     91        /* return 0 here so this looks like unset */ 
     92        if (rv < 0) 
     93                return 0; 
     94        var0 = simple_strtoul(buf, NULL, 0); 
     95 
     96        snprintf(key, sizeof(key), "%s1", name); 
     97        rv = nvram_getenv(key, buf, len); 
     98        if (rv < 0) 
     99                return 0; 
     100        var1 = simple_strtoul(buf, NULL, 0); 
     101        return var1 << 16 | var0; 
     102} 
     103 
    78104static void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix) 
    79105{ 
    80106        char buf[100]; 
    static void bcm47xx_fill_sprom(struct ss 
    84110 
    85111        sprom->revision = 1; /* Fallback: Old hardware does not define this. */ 
    86112        READ_FROM_NVRAM(revision, "sromrev", buf); 
    87         if (nvram_getprefix(prefix, "il0macaddr", buf, sizeof(buf)) >= 0) 
     113        if (nvram_getprefix(prefix, "il0macaddr", buf, sizeof(buf)) >= 0 || 
     114+           nvram_getprefix(prefix, "macaddr", buf, sizeof(buf)) >= 0) 
    88115                nvram_parse_macaddr(buf, sprom->il0mac); 
    89116        if (nvram_getprefix(prefix, "et0macaddr", buf, sizeof(buf)) >= 0) 
    90117                nvram_parse_macaddr(buf, sprom->et0mac); 
    static void bcm47xx_fill_sprom(struct ss 
    110137        READ_FROM_NVRAM(pa1hib0, "pa1hib0", buf); 
    111138        READ_FROM_NVRAM(pa1hib2, "pa1hib1", buf); 
    112139        READ_FROM_NVRAM(pa1hib1, "pa1hib2", buf); 
    113         READ_FROM_NVRAM(gpio0, "wl0gpio0", buf); 
    114         READ_FROM_NVRAM(gpio1, "wl0gpio1", buf); 
    115         READ_FROM_NVRAM(gpio2, "wl0gpio2", buf); 
    116         READ_FROM_NVRAM(gpio3, "wl0gpio3", buf); 
    117         READ_FROM_NVRAM(maxpwr_bg, "pa0maxpwr", buf); 
    118         READ_FROM_NVRAM(maxpwr_al, "pa1lomaxpwr", buf); 
    119         READ_FROM_NVRAM(maxpwr_a, "pa1maxpwr", buf); 
    120         READ_FROM_NVRAM(maxpwr_ah, "pa1himaxpwr", buf); 
    121         READ_FROM_NVRAM(itssi_a, "pa1itssit", buf); 
    122         READ_FROM_NVRAM(itssi_bg, "pa0itssit", buf); 
     140        READ_FROM_NVRAM2(gpio0, "ledbh0", "wl0gpio0", buf); 
     141        READ_FROM_NVRAM2(gpio1, "ledbh1", "wl0gpio1", buf); 
     142        READ_FROM_NVRAM2(gpio2, "ledbh2", "wl0gpio2", buf); 
     143        READ_FROM_NVRAM2(gpio3, "ledbh3", "wl0gpio3", buf); 
     144        READ_FROM_NVRAM2(maxpwr_bg, "maxp2ga0", "pa0maxpwr", buf); 
     145        READ_FROM_NVRAM2(maxpwr_al, "maxp5gla0", "pa1lomaxpwr", buf); 
     146        READ_FROM_NVRAM2(maxpwr_a, "maxp5ga0", "pa1maxpwr", buf); 
     147        READ_FROM_NVRAM2(maxpwr_ah, "maxp5gha0", "pa1himaxpwr", buf); 
     148        READ_FROM_NVRAM2(itssi_bg, "itt5ga0", "pa0itssit", buf); 
     149        READ_FROM_NVRAM2(itssi_a, "itt2ga0", "pa1itssit", buf); 
    123150        READ_FROM_NVRAM(tri2g, "tri2g", buf); 
    124151        READ_FROM_NVRAM(tri5gl, "tri5gl", buf); 
    125152        READ_FROM_NVRAM(tri5g, "tri5g", buf); 
    126153        READ_FROM_NVRAM(tri5gh, "tri5gh", buf); 
     154        READ_FROM_NVRAM(txpid2g[0], "txpid2ga0", buf); 
     155        READ_FROM_NVRAM(txpid2g[1], "txpid2ga1", buf); 
     156        READ_FROM_NVRAM(txpid2g[2], "txpid2ga2", buf); 
     157        READ_FROM_NVRAM(txpid2g[3], "txpid2ga3", buf); 
     158        READ_FROM_NVRAM(txpid5g[0], "txpid5ga0", buf); 
     159        READ_FROM_NVRAM(txpid5g[1], "txpid5ga1", buf); 
     160        READ_FROM_NVRAM(txpid5g[2], "txpid5ga2", buf); 
     161        READ_FROM_NVRAM(txpid5g[3], "txpid5ga3", buf); 
     162        READ_FROM_NVRAM(txpid5gl[0], "txpid5gla0", buf); 
     163        READ_FROM_NVRAM(txpid5gl[1], "txpid5gla1", buf); 
     164        READ_FROM_NVRAM(txpid5gl[2], "txpid5gla2", buf); 
     165        READ_FROM_NVRAM(txpid5gl[3], "txpid5gla3", buf); 
     166        READ_FROM_NVRAM(txpid5gh[0], "txpid5gha0", buf); 
     167        READ_FROM_NVRAM(txpid5gh[1], "txpid5gha1", buf); 
     168        READ_FROM_NVRAM(txpid5gh[2], "txpid5gha2", buf); 
     169        READ_FROM_NVRAM(txpid5gh[3], "txpid5gha3", buf); 
    127170        READ_FROM_NVRAM(rxpo2g, "rxpo2g", buf); 
    128171        READ_FROM_NVRAM(rxpo5g, "rxpo5g", buf); 
    129172        READ_FROM_NVRAM(rssisav2g, "rssisav2g", buf); 
    static void bcm47xx_fill_sprom(struct ss 
    135178        READ_FROM_NVRAM(rssismf5g, "rssismf5g", buf); 
    136179        READ_FROM_NVRAM(bxa5g, "bxa5g", buf); 
    137180        READ_FROM_NVRAM(cck2gpo, "cck2gpo", buf); 
    138         READ_FROM_NVRAM(ofdm2gpo, "ofdm2gpo", buf); 
    139         READ_FROM_NVRAM(ofdm5glpo, "ofdm5glpo", buf); 
    140         READ_FROM_NVRAM(ofdm5gpo, "ofdm5gpo", buf); 
    141         READ_FROM_NVRAM(ofdm5ghpo, "ofdm5ghpo", buf); 
     181 
     182        sprom->ofdm2gpo = nvram_getu32("ofdm2gpo", buf, sizeof(buf)); 
     183        sprom->ofdm5glpo = nvram_getu32("ofdm5glpo", buf, sizeof(buf)); 
     184        sprom->ofdm5gpo = nvram_getu32("ofdm5gpo", buf, sizeof(buf)); 
     185        sprom->ofdm5ghpo = nvram_getu32("ofdm5ghpo", buf, sizeof(buf)); 
     186 
     187        READ_FROM_NVRAM(antenna_gain.ghz24.a0, "ag0", buf); 
     188        READ_FROM_NVRAM(antenna_gain.ghz24.a1, "ag1", buf); 
     189        READ_FROM_NVRAM(antenna_gain.ghz24.a2, "ag2", buf); 
     190        READ_FROM_NVRAM(antenna_gain.ghz24.a3, "ag3", buf); 
     191        memcpy(&sprom->antenna_gain.ghz5, &sprom->antenna_gain.ghz24, 
     192               sizeof(sprom->antenna_gain.ghz5)); 
    142193 
    143194        if (nvram_getprefix(prefix, "boardflags", buf, sizeof(buf)) >= 0) { 
    144195                boardflags = simple_strtoul(buf, NULL, 0); 
Note: See TracBrowser for help on using the repository browser.