Signed-off-by: Álvaro Fernández Rojas <nolt...@gmail.com>
---
diff --git a/package/kernel/broadcom-wl/patches/910-fallback-sprom.patch 
b/package/kernel/broadcom-wl/patches/910-fallback-sprom.patch
index 749ecbf..cf9ce63 100644
--- a/package/kernel/broadcom-wl/patches/910-fallback-sprom.patch
+++ b/package/kernel/broadcom-wl/patches/910-fallback-sprom.patch
@@ -6,24 +6,13 @@
  
 +#if defined(CONFIG_SSB_PCIHOST) && defined(CONFIG_BOARD_BCM963XX)
 +#include <linux/ssb/ssb.h>
-+extern struct ssb_sprom bcm63xx_sprom;
++extern int bcm63xx_get_fallback_sprom(uint pci_bus, uint pci_slot, struct 
ssb_sprom *out);
 +#endif
 +
  #ifdef WLTEST
  #include <sbsprom.h>
  #endif /* WLTEST */
-@@ -2058,6 +2063,10 @@ BCMATTACHFN(initvars_srom_pci)(si_t *sih
-       bool flash = FALSE;
-       int err = 0;
- 
-+#if defined(CONFIG_SSB_PCIHOST) && defined(CONFIG_BOARD_BCM963XX)
-+      char eabuf[18];
-+#endif
-+
-       /*
-        * Apply CRC over SROM content regardless SROM is present or not,
-        * and use variable <devpath>sromrev's existance in flash to decide
-@@ -2120,6 +2129,58 @@ BCMATTACHFN(initvars_srom_pci)(si_t *sih
+@@ -2120,6 +2125,221 @@ BCMATTACHFN(initvars_srom_pci)(si_t *sih
                        goto varscont;
                }
  
@@ -32,37 +21,200 @@
 +
 +              if( base != NULL )
 +              {
++                      char eabuf[18];
++                      struct ssb_sprom bcm63xx_sprom;
++                      uint pci_bus = osl_pci_bus(osh), pci_slot = 
osl_pci_slot(osh);
++
 +                      varbuf_init(&b, base, MAXSZ_NVRAM_VARS);
 +
-+                      printk("Got version %i SPROM from SSB\n", 
bcm63xx_sprom.revision);
++                      bcm63xx_get_fallback_sprom(pci_bus, pci_slot, 
&bcm63xx_sprom);
++                      printk("BCM%X(%02x:%02x) using sprom version %i\n", 
sih->chip, pci_bus, pci_slot, bcm63xx_sprom.revision);
++
++                      switch (bcm63xx_sprom.revision) {
++                              case 8:
++                                      varbuf_append(&b, vstr_tri2g, 
bcm63xx_sprom.tri2g);
++                                      varbuf_append(&b, vstr_tri5g, 
bcm63xx_sprom.tri5g);
++                                      varbuf_append(&b, vstr_tri5gl, 
bcm63xx_sprom.tri5gl);
++                                      varbuf_append(&b, vstr_tri5gh, 
bcm63xx_sprom.tri5gh);
++
++                                      varbuf_append(&b, vstr_rxpo2g, 
bcm63xx_sprom.rxpo2g);
++                                      varbuf_append(&b, vstr_rxpo5g, 
bcm63xx_sprom.rxpo5g);
++
++                                      varbuf_append(&b, vstr_rssismf2g, 
bcm63xx_sprom.rssismf2g);
++                                      varbuf_append(&b, vstr_rssismc2g, 
bcm63xx_sprom.rssismc2g);
++                                      varbuf_append(&b, vstr_rssisav2g, 
bcm63xx_sprom.rssisav2g);
++
++                                      varbuf_append(&b, vstr_bxa2g, 
bcm63xx_sprom.bxa2g);
++                                      varbuf_append(&b, vstr_bxa5g, 
bcm63xx_sprom.bxa5g);
++
++                                      varbuf_append(&b, vstr_rssismf5g, 
bcm63xx_sprom.rssismf5g);
++                                      varbuf_append(&b, vstr_rssismc5g, 
bcm63xx_sprom.rssismc5g);
++                                      varbuf_append(&b, vstr_rssisav5g, 
bcm63xx_sprom.rssisav5g);
++
++                                      varbuf_append(&b, vstr_cck2gpo, 
bcm63xx_sprom.cck2gpo);
++
++                                      varbuf_append(&b, vstr_ofdm2gpo, 
bcm63xx_sprom.ofdm2gpo);
++                                      varbuf_append(&b, vstr_ofdm5glpo, 
bcm63xx_sprom.ofdm5glpo);
++                                      varbuf_append(&b, vstr_ofdm5gpo, 
bcm63xx_sprom.ofdm5gpo);
++                                      varbuf_append(&b, vstr_ofdm5ghpo, 
bcm63xx_sprom.ofdm5ghpo);
++
++                                      varbuf_append(&b, vstr_itt2ga0, 
bcm63xx_sprom.core_pwr_info[0].itssi_2g);
++                                      varbuf_append(&b, vstr_itt2ga1, 
bcm63xx_sprom.core_pwr_info[1].itssi_2g);
++                                      varbuf_append(&b, vstr_maxp2ga0, 
bcm63xx_sprom.core_pwr_info[0].maxpwr_2g);
++                                      varbuf_append(&b, vstr_maxp2ga1, 
bcm63xx_sprom.core_pwr_info[1].maxpwr_2g);
++
++                                      varbuf_append(&b, vstr_pa, 2, 0, 0, 
bcm63xx_sprom.core_pwr_info[0].pa_2g[0]);
++                                      varbuf_append(&b, vstr_pa, 2, 1, 0, 
bcm63xx_sprom.core_pwr_info[0].pa_2g[1]);
++                                      varbuf_append(&b, vstr_pa, 2, 2, 0, 
bcm63xx_sprom.core_pwr_info[0].pa_2g[2]);
++                                      varbuf_append(&b, vstr_pa, 2, 0, 1, 
bcm63xx_sprom.core_pwr_info[1].pa_2g[0]);
++                                      varbuf_append(&b, vstr_pa, 2, 1, 1, 
bcm63xx_sprom.core_pwr_info[1].pa_2g[1]);
++                                      varbuf_append(&b, vstr_pa, 2, 2, 1, 
bcm63xx_sprom.core_pwr_info[1].pa_2g[2]);
++
++                                      varbuf_append(&b, vstr_itt5ga0, 
bcm63xx_sprom.core_pwr_info[0].itssi_5g);
++                                      varbuf_append(&b, vstr_itt5ga1, 
bcm63xx_sprom.core_pwr_info[1].itssi_5g);
++                                      varbuf_append(&b, vstr_maxp5ga0, 
bcm63xx_sprom.core_pwr_info[0].maxpwr_5g);
++                                      varbuf_append(&b, vstr_maxp5ga1, 
bcm63xx_sprom.core_pwr_info[1].maxpwr_5g);
++                                      varbuf_append(&b, vstr_maxp5gha0, 
bcm63xx_sprom.core_pwr_info[0].maxpwr_5gh);
++                                      varbuf_append(&b, vstr_maxp5gha1, 
bcm63xx_sprom.core_pwr_info[1].maxpwr_5gh);
++                                      varbuf_append(&b, vstr_maxp5gla0, 
bcm63xx_sprom.core_pwr_info[0].maxpwr_5gl);
++                                      varbuf_append(&b, vstr_maxp5gla1, 
bcm63xx_sprom.core_pwr_info[1].maxpwr_5gl);
++
++                                      varbuf_append(&b, vstr_pahl, 5, 'l', 0, 
0, bcm63xx_sprom.core_pwr_info[0].pa_5gl[0]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'l', 1, 
0, bcm63xx_sprom.core_pwr_info[0].pa_5gl[1]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'l', 2, 
0, bcm63xx_sprom.core_pwr_info[0].pa_5gl[2]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'l', 0, 
1, bcm63xx_sprom.core_pwr_info[1].pa_5gl[0]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'l', 1, 
1, bcm63xx_sprom.core_pwr_info[1].pa_5gl[1]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'l', 2, 
1, bcm63xx_sprom.core_pwr_info[1].pa_5gl[2]);
++
++                                      varbuf_append(&b, vstr_pa, 5, 0, 0, 
bcm63xx_sprom.core_pwr_info[0].pa_5g[0]);
++                                      varbuf_append(&b, vstr_pa, 5, 1, 0, 
bcm63xx_sprom.core_pwr_info[0].pa_5g[1]);
++                                      varbuf_append(&b, vstr_pa, 5, 2, 0, 
bcm63xx_sprom.core_pwr_info[0].pa_5g[2]);
++                                      varbuf_append(&b, vstr_pa, 5, 0, 1, 
bcm63xx_sprom.core_pwr_info[1].pa_5g[0]);
++                                      varbuf_append(&b, vstr_pa, 5, 1, 1, 
bcm63xx_sprom.core_pwr_info[1].pa_5g[1]);
++                                      varbuf_append(&b, vstr_pa, 5, 2, 1, 
bcm63xx_sprom.core_pwr_info[1].pa_5g[2]);
++
++                                      varbuf_append(&b, vstr_pahl, 5, 'h', 0, 
0, bcm63xx_sprom.core_pwr_info[0].pa_5gh[0]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'h', 1, 
0, bcm63xx_sprom.core_pwr_info[0].pa_5gh[1]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'h', 2, 
0, bcm63xx_sprom.core_pwr_info[0].pa_5gh[2]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'h', 0, 
1, bcm63xx_sprom.core_pwr_info[1].pa_5gh[0]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'h', 1, 
1, bcm63xx_sprom.core_pwr_info[1].pa_5gh[1]);
++                                      varbuf_append(&b, vstr_pahl, 5, 'h', 2, 
1, bcm63xx_sprom.core_pwr_info[1].pa_5gh[2]);
++
++                                      varbuf_append(&b, vstr_tssipos2g, 
bcm63xx_sprom.fem.ghz2.tssipos);
++                                      varbuf_append(&b, vstr_extpagain2g, 
bcm63xx_sprom.fem.ghz2.extpa_gain);
++                                      varbuf_append(&b, vstr_pdetrange2g, 
bcm63xx_sprom.fem.ghz2.pdet_range);
++                                      varbuf_append(&b, vstr_triso2g, 
bcm63xx_sprom.fem.ghz2.tr_iso);
++                                      varbuf_append(&b, vstr_antswctl2g, 
bcm63xx_sprom.fem.ghz2.antswlut);
++
++                                      varbuf_append(&b, vstr_tssipos5g, 
bcm63xx_sprom.fem.ghz5.tssipos);
++                                      varbuf_append(&b, vstr_extpagain5g, 
bcm63xx_sprom.fem.ghz5.extpa_gain);
++                                      varbuf_append(&b, vstr_pdetrange5g, 
bcm63xx_sprom.fem.ghz5.pdet_range);
++                                      varbuf_append(&b, vstr_triso5g, 
bcm63xx_sprom.fem.ghz5.tr_iso);
++                                      varbuf_append(&b, vstr_antswctl5g, 
bcm63xx_sprom.fem.ghz5.antswlut);
++
++                                      varbuf_append(&b, vstr_leddc, 
(bcm63xx_sprom.leddc_on_time << 8) | bcm63xx_sprom.leddc_off_time);
++
++                                      varbuf_append(&b, vstr_txchain, 
bcm63xx_sprom.txchain);
++                                      varbuf_append(&b, vstr_rxchain, 
bcm63xx_sprom.rxchain);
++                                      varbuf_append(&b, vstr_antswitch, 
bcm63xx_sprom.antswitch);
++
++                                      varbuf_append(&b, vstr_mcspo, 2, 0, 
bcm63xx_sprom.mcs2gpo[0]);
++                                      varbuf_append(&b, vstr_mcspo, 2, 1, 
bcm63xx_sprom.mcs2gpo[1]);
++                                      varbuf_append(&b, vstr_mcspo, 2, 2, 
bcm63xx_sprom.mcs2gpo[2]);
++                                      varbuf_append(&b, vstr_mcspo, 2, 3, 
bcm63xx_sprom.mcs2gpo[3]);
++                                      varbuf_append(&b, vstr_mcspo, 2, 4, 
bcm63xx_sprom.mcs2gpo[4]);
++                                      varbuf_append(&b, vstr_mcspo, 2, 5, 
bcm63xx_sprom.mcs2gpo[5]);
++                                      varbuf_append(&b, vstr_mcspo, 2, 6, 
bcm63xx_sprom.mcs2gpo[6]);
++                                      varbuf_append(&b, vstr_mcspo, 2, 7, 
bcm63xx_sprom.mcs2gpo[7]);
++
++                                      varbuf_append(&b, vstr_mcspo, 5, 0, 
bcm63xx_sprom.mcs5gpo[0]);
++                                      varbuf_append(&b, vstr_mcspo, 5, 1, 
bcm63xx_sprom.mcs5gpo[1]);
++                                      varbuf_append(&b, vstr_mcspo, 5, 2, 
bcm63xx_sprom.mcs5gpo[2]);
++                                      varbuf_append(&b, vstr_mcspo, 5, 3, 
bcm63xx_sprom.mcs5gpo[3]);
++                                      varbuf_append(&b, vstr_mcspo, 5, 4, 
bcm63xx_sprom.mcs5gpo[4]);
++                                      varbuf_append(&b, vstr_mcspo, 5, 5, 
bcm63xx_sprom.mcs5gpo[5]);
++                                      varbuf_append(&b, vstr_mcspo, 5, 6, 
bcm63xx_sprom.mcs5gpo[6]);
++                                      varbuf_append(&b, vstr_mcspo, 5, 7, 
bcm63xx_sprom.mcs5gpo[7]);
++
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'l', 
0, bcm63xx_sprom.mcs5glpo[0]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'l', 
1, bcm63xx_sprom.mcs5glpo[1]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'l', 
2, bcm63xx_sprom.mcs5glpo[2]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'l', 
3, bcm63xx_sprom.mcs5glpo[3]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'l', 
4, bcm63xx_sprom.mcs5glpo[4]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'l', 
5, bcm63xx_sprom.mcs5glpo[5]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'l', 
6, bcm63xx_sprom.mcs5glpo[6]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'l', 
7, bcm63xx_sprom.mcs5glpo[7]);
++
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'h', 
0, bcm63xx_sprom.mcs5ghpo[0]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'h', 
1, bcm63xx_sprom.mcs5ghpo[1]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'h', 
2, bcm63xx_sprom.mcs5ghpo[2]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'h', 
3, bcm63xx_sprom.mcs5ghpo[3]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'h', 
4, bcm63xx_sprom.mcs5ghpo[4]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'h', 
5, bcm63xx_sprom.mcs5ghpo[5]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'h', 
6, bcm63xx_sprom.mcs5ghpo[6]);
++                                      varbuf_append(&b, vstr_mcspohl, 5, 'h', 
7, bcm63xx_sprom.mcs5ghpo[7]);
++
++                              case 4:
++                              case 5:
++                                      varbuf_append(&b, vstr_boardflags2, 
(bcm63xx_sprom.boardflags2_hi << 16) | bcm63xx_sprom.boardflags2_lo);
++
++                                      varbuf_append(&b, vstr_ag, 2, 
bcm63xx_sprom.antenna_gain.a2);
++                                      varbuf_append(&b, vstr_ag, 3, 
bcm63xx_sprom.antenna_gain.a3);
++
++                              case 2:
++                              case 3:
++                                      varbuf_append(&b, vstr_opo, 
bcm63xx_sprom.opo);
++
++                                      varbuf_append(&b, vstr_pa1lob[0], 
bcm63xx_sprom.pa1lob0);
++                                      varbuf_append(&b, vstr_pa1lob[1], 
bcm63xx_sprom.pa1lob1);
++                                      varbuf_append(&b, vstr_pa1lob[2], 
bcm63xx_sprom.pa1lob2);
++                                      varbuf_append(&b, vstr_pa1hib[0], 
bcm63xx_sprom.pa1hib0);
++                                      varbuf_append(&b, vstr_pa1hib[1], 
bcm63xx_sprom.pa1hib1);
++                                      varbuf_append(&b, vstr_pa1hib[2], 
bcm63xx_sprom.pa1hib2);
++
++                                      varbuf_append(&b, vstr_pa1lomaxpwr, 
bcm63xx_sprom.maxpwr_al);
++                                      varbuf_append(&b, vstr_pa1himaxpwr, 
bcm63xx_sprom.maxpwr_ah);
++
++                              case 1:
++                                      varbuf_append(&b, vstr_sromrev, 
bcm63xx_sprom.revision);
++                                      varbuf_append(&b, vstr_boardrev, 
bcm63xx_sprom.board_rev);
++                                      varbuf_append(&b, vstr_boardtype, 
bcm63xx_sprom.board_type);
++
++                                      varbuf_append(&b, vstr_noccode);
++
++                                      varbuf_append(&b, vstr_aa2g, 
bcm63xx_sprom.ant_available_bg);
++                                      varbuf_append(&b, vstr_aa5g, 
bcm63xx_sprom.ant_available_a);
 +
-+                      varbuf_append(&b, vstr_sromrev, bcm63xx_sprom.revision);
-+                      varbuf_append(&b, vstr_boardrev, 
bcm63xx_sprom.board_rev);
++                                      varbuf_append(&b, vstr_pa0b[0], 
bcm63xx_sprom.pa0b0);
++                                      varbuf_append(&b, vstr_pa0b[1], 
bcm63xx_sprom.pa0b1);
++                                      varbuf_append(&b, vstr_pa0b[2], 
bcm63xx_sprom.pa0b2);
++                                      varbuf_append(&b, vstr_pa1b[0], 
bcm63xx_sprom.pa1b0);
++                                      varbuf_append(&b, vstr_pa1b[1], 
bcm63xx_sprom.pa1b1);
++                                      varbuf_append(&b, vstr_pa1b[2], 
bcm63xx_sprom.pa1b2);
 +
-+                      /* ToDo: map bcm63xx_sprom.country_code */
-+                      varbuf_append(&b, vstr_noccode);
++                                      varbuf_append(&b, vstr_pa0maxpwr, 
bcm63xx_sprom.maxpwr_bg);
++                                      varbuf_append(&b, vstr_pa1maxpwr, 
bcm63xx_sprom.maxpwr_a);
 +
-+                      varbuf_append(&b, vstr_aa2g, 
bcm63xx_sprom.ant_available_bg);
++                                      varbuf_append(&b, vstr_pa1itssit, 
bcm63xx_sprom.itssi_a);
++                                      varbuf_append(&b, vstr_pa0itssit, 
bcm63xx_sprom.itssi_bg);
 +
-+                      varbuf_append(&b, vstr_pa0b[0], bcm63xx_sprom.pa0b0);
-+                      varbuf_append(&b, vstr_pa1b[0], bcm63xx_sprom.pa1b0);
-+                      varbuf_append(&b, vstr_pa0b[1], bcm63xx_sprom.pa0b1);
-+                      varbuf_append(&b, vstr_pa1b[1], bcm63xx_sprom.pa1b1);
-+                      varbuf_append(&b, vstr_pa0b[2], bcm63xx_sprom.pa0b2);
-+                      varbuf_append(&b, vstr_pa1b[2], bcm63xx_sprom.pa1b2);
++                                      varbuf_append(&b, vstr_boardflags, 
(bcm63xx_sprom.boardflags_hi << 16) | bcm63xx_sprom.boardflags_lo);
 +
-+                      varbuf_append(&b, vstr_pa0maxpwr, 
bcm63xx_sprom.maxpwr_bg);
-+                      varbuf_append(&b, vstr_pa0itssit, 
bcm63xx_sprom.itssi_bg);
++                                      varbuf_append(&b, vstr_ag, 0, 
bcm63xx_sprom.antenna_gain.a0);
++                                      varbuf_append(&b, vstr_ag, 1, 
bcm63xx_sprom.antenna_gain.a1);
 +
-+                      varbuf_append(&b, vstr_boardflags, 
(bcm63xx_sprom.boardflags_hi << 16) | bcm63xx_sprom.boardflags_lo);
-+                      varbuf_append(&b, vstr_boardflags2, 
(bcm63xx_sprom.boardflags2_hi << 16) | bcm63xx_sprom.boardflags2_lo);
++                                      snprintf(eabuf, sizeof(eabuf), 
"%02x:%02x:%02x:%02x:%02x:%02x",
++                                              bcm63xx_sprom.il0mac[0], 
bcm63xx_sprom.il0mac[1], bcm63xx_sprom.il0mac[2],
++                                              bcm63xx_sprom.il0mac[3], 
bcm63xx_sprom.il0mac[4], bcm63xx_sprom.il0mac[5]
++                                      );
++                                      varbuf_append(&b, vstr_macaddr, eabuf);
 +
-+                      snprintf(eabuf, sizeof(eabuf), 
"%02x:%02x:%02x:%02x:%02x:%02x",
-+                              bcm63xx_sprom.il0mac[0], 
bcm63xx_sprom.il0mac[1], bcm63xx_sprom.il0mac[2],
-+                              bcm63xx_sprom.il0mac[3], 
bcm63xx_sprom.il0mac[4], bcm63xx_sprom.il0mac[5]
-+                      );
++                                      break;
 +
-+                      varbuf_append(&b, vstr_macaddr, eabuf);
++                              default:
++                                      printk("unsupported sprom version 
%i\n", bcm63xx_sprom.revision);
++                                      break;
++                      }
 +
 +                      /* final nullbyte terminator */
 +                      ASSERT(b.size >= 1);
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to