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