Commit 28562f3c authored by Arend van Spriel's avatar Arend van Spriel Committed by Greg Kroah-Hartman

staging: brcm80211: remove support functions for older chipsets from bcmsrom

The source file contained functions for both older and current chipsets
but the brcmsmac driver does not support the older chipsets so those
functions are removed.
Reviewed-by: default avatarHenry Ptasinski <henryp@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 72a27962
......@@ -164,1216 +164,6 @@ int srom_var_init(si_t *sih, uint bustype, void *curmap,
return -1;
}
/* support only 16-bit word read from srom */
int
srom_read(si_t *sih, uint bustype, void *curmap,
uint byteoff, uint nbytes, u16 *buf, bool check_crc)
{
uint off, nw;
#ifdef BCMSDIO
uint i;
#endif /* BCMSDIO */
ASSERT(bustype == bustype);
/* check input - 16-bit access only */
if (byteoff & 1 || nbytes & 1 || (byteoff + nbytes) > SROM_MAX)
return 1;
off = byteoff / 2;
nw = nbytes / 2;
if (bustype == PCI_BUS) {
if (!curmap)
return 1;
if (si_is_sprom_available(sih)) {
u16 *srom;
srom = (u16 *) SROM_OFFSET(sih);
if (srom == NULL)
return 1;
if (sprom_read_pci
(sih, srom, off, buf, nw, check_crc))
return 1;
}
#if defined(BCMNVRAMR)
else {
if (otp_read_pci(sih, buf, SROM_MAX))
return 1;
}
#endif
#ifdef BCMSDIO
} else if (bustype == SDIO_BUS) {
off = byteoff / 2;
nw = nbytes / 2;
for (i = 0; i < nw; i++) {
if (sprom_read_sdio
((u16) (off + i), (u16 *) (buf + i)))
return 1;
}
#endif /* BCMSDIO */
} else if (bustype == SI_BUS) {
return 1;
} else {
return 1;
}
return 0;
}
static const char vstr_manf[] = "manf=%s";
static const char vstr_productname[] = "productname=%s";
static const char vstr_manfid[] = "manfid=0x%x";
static const char vstr_prodid[] = "prodid=0x%x";
#ifdef BCMSDIO
static const char vstr_sdmaxspeed[] = "sdmaxspeed=%d";
static const char vstr_sdmaxblk[][13] = {
"sdmaxblk0=%d", "sdmaxblk1=%d", "sdmaxblk2=%d"};
#endif
static const char vstr_regwindowsz[] = "regwindowsz=%d";
static const char vstr_sromrev[] = "sromrev=%d";
static const char vstr_chiprev[] = "chiprev=%d";
static const char vstr_subvendid[] = "subvendid=0x%x";
static const char vstr_subdevid[] = "subdevid=0x%x";
static const char vstr_boardrev[] = "boardrev=0x%x";
static const char vstr_aa2g[] = "aa2g=0x%x";
static const char vstr_aa5g[] = "aa5g=0x%x";
static const char vstr_ag[] = "ag%d=0x%x";
static const char vstr_cc[] = "cc=%d";
static const char vstr_opo[] = "opo=%d";
static const char vstr_pa0b[][9] = {
"pa0b0=%d", "pa0b1=%d", "pa0b2=%d"};
static const char vstr_pa0itssit[] = "pa0itssit=%d";
static const char vstr_pa0maxpwr[] = "pa0maxpwr=%d";
static const char vstr_pa1b[][9] = {
"pa1b0=%d", "pa1b1=%d", "pa1b2=%d"};
static const char vstr_pa1lob[][11] = {
"pa1lob0=%d", "pa1lob1=%d", "pa1lob2=%d"};
static const char vstr_pa1hib[][11] = {
"pa1hib0=%d", "pa1hib1=%d", "pa1hib2=%d"};
static const char vstr_pa1itssit[] = "pa1itssit=%d";
static const char vstr_pa1maxpwr[] = "pa1maxpwr=%d";
static const char vstr_pa1lomaxpwr[] = "pa1lomaxpwr=%d";
static const char vstr_pa1himaxpwr[] = "pa1himaxpwr=%d";
static const char vstr_oem[] =
"oem=%02x%02x%02x%02x%02x%02x%02x%02x";
static const char vstr_boardflags[] = "boardflags=0x%x";
static const char vstr_boardflags2[] = "boardflags2=0x%x";
static const char vstr_ledbh[] = "ledbh%d=0x%x";
static const char vstr_noccode[] = "ccode=0x0";
static const char vstr_ccode[] = "ccode=%c%c";
static const char vstr_cctl[] = "cctl=0x%x";
static const char vstr_cckpo[] = "cckpo=0x%x";
static const char vstr_ofdmpo[] = "ofdmpo=0x%x";
static const char vstr_rdlid[] = "rdlid=0x%x";
static const char vstr_rdlrndis[] = "rdlrndis=%d";
static const char vstr_rdlrwu[] = "rdlrwu=%d";
static const char vstr_usbfs[] = "usbfs=%d";
static const char vstr_wpsgpio[] = "wpsgpio=%d";
static const char vstr_wpsled[] = "wpsled=%d";
static const char vstr_rdlsn[] = "rdlsn=%d";
static const char vstr_rssismf2g[] = "rssismf2g=%d";
static const char vstr_rssismc2g[] = "rssismc2g=%d";
static const char vstr_rssisav2g[] = "rssisav2g=%d";
static const char vstr_bxa2g[] = "bxa2g=%d";
static const char vstr_rssismf5g[] = "rssismf5g=%d";
static const char vstr_rssismc5g[] = "rssismc5g=%d";
static const char vstr_rssisav5g[] = "rssisav5g=%d";
static const char vstr_bxa5g[] = "bxa5g=%d";
static const char vstr_tri2g[] = "tri2g=%d";
static const char vstr_tri5gl[] = "tri5gl=%d";
static const char vstr_tri5g[] = "tri5g=%d";
static const char vstr_tri5gh[] = "tri5gh=%d";
static const char vstr_rxpo2g[] = "rxpo2g=%d";
static const char vstr_rxpo5g[] = "rxpo5g=%d";
static const char vstr_boardtype[] = "boardtype=0x%x";
static const char vstr_leddc[] = "leddc=0x%04x";
static const char vstr_vendid[] = "vendid=0x%x";
static const char vstr_devid[] = "devid=0x%x";
static const char vstr_xtalfreq[] = "xtalfreq=%d";
static const char vstr_txchain[] = "txchain=0x%x";
static const char vstr_rxchain[] = "rxchain=0x%x";
static const char vstr_antswitch[] = "antswitch=0x%x";
static const char vstr_regrev[] = "regrev=0x%x";
static const char vstr_antswctl2g[] = "antswctl2g=0x%x";
static const char vstr_triso2g[] = "triso2g=0x%x";
static const char vstr_pdetrange2g[] = "pdetrange2g=0x%x";
static const char vstr_extpagain2g[] = "extpagain2g=0x%x";
static const char vstr_tssipos2g[] = "tssipos2g=0x%x";
static const char vstr_antswctl5g[] = "antswctl5g=0x%x";
static const char vstr_triso5g[] = "triso5g=0x%x";
static const char vstr_pdetrange5g[] = "pdetrange5g=0x%x";
static const char vstr_extpagain5g[] = "extpagain5g=0x%x";
static const char vstr_tssipos5g[] = "tssipos5g=0x%x";
static const char vstr_maxp2ga0[] = "maxp2ga0=0x%x";
static const char vstr_itt2ga0[] = "itt2ga0=0x%x";
static const char vstr_pa[] = "pa%dgw%da%d=0x%x";
static const char vstr_pahl[] = "pa%dg%cw%da%d=0x%x";
static const char vstr_maxp5ga0[] = "maxp5ga0=0x%x";
static const char vstr_itt5ga0[] = "itt5ga0=0x%x";
static const char vstr_maxp5gha0[] = "maxp5gha0=0x%x";
static const char vstr_maxp5gla0[] = "maxp5gla0=0x%x";
static const char vstr_maxp2ga1[] = "maxp2ga1=0x%x";
static const char vstr_itt2ga1[] = "itt2ga1=0x%x";
static const char vstr_maxp5ga1[] = "maxp5ga1=0x%x";
static const char vstr_itt5ga1[] = "itt5ga1=0x%x";
static const char vstr_maxp5gha1[] = "maxp5gha1=0x%x";
static const char vstr_maxp5gla1[] = "maxp5gla1=0x%x";
static const char vstr_cck2gpo[] = "cck2gpo=0x%x";
static const char vstr_ofdm2gpo[] = "ofdm2gpo=0x%x";
static const char vstr_ofdm5gpo[] = "ofdm5gpo=0x%x";
static const char vstr_ofdm5glpo[] = "ofdm5glpo=0x%x";
static const char vstr_ofdm5ghpo[] = "ofdm5ghpo=0x%x";
static const char vstr_cddpo[] = "cddpo=0x%x";
static const char vstr_stbcpo[] = "stbcpo=0x%x";
static const char vstr_bw40po[] = "bw40po=0x%x";
static const char vstr_bwduppo[] = "bwduppo=0x%x";
static const char vstr_mcspo[] = "mcs%dgpo%d=0x%x";
static const char vstr_mcspohl[] = "mcs%dg%cpo%d=0x%x";
static const char vstr_custom[] = "customvar%d=0x%x";
static const char vstr_cckdigfilttype[] = "cckdigfilttype=%d";
static const char vstr_boardnum[] = "boardnum=%d";
static const char vstr_macaddr[] = "macaddr=%s";
static const char vstr_usbepnum[] = "usbepnum=0x%x";
static const char vstr_end[] = "END\0";
u8 patch_pair;
/* For dongle HW, accept partial calibration parameters */
#define BCMDONGLECASE(n)
int srom_parsecis(u8 *pcis[], uint ciscnt, char **vars,
uint *count)
{
char eabuf[32];
char *base;
varbuf_t b;
u8 *cis, tup, tlen, sromrev = 1;
int i, j;
bool ag_init = false;
u32 w32;
uint funcid;
uint cisnum;
s32 boardnum;
int err;
bool standard_cis;
ASSERT(vars != NULL);
ASSERT(count != NULL);
boardnum = -1;
base = kmalloc(MAXSZ_NVRAM_VARS, GFP_ATOMIC);
ASSERT(base != NULL);
if (!base)
return -2;
varbuf_init(&b, base, MAXSZ_NVRAM_VARS);
memset(base, 0, MAXSZ_NVRAM_VARS);
eabuf[0] = '\0';
for (cisnum = 0; cisnum < ciscnt; cisnum++) {
cis = *pcis++;
i = 0;
funcid = 0;
standard_cis = true;
do {
if (standard_cis) {
tup = cis[i++];
if (tup == CISTPL_NULL || tup == CISTPL_END)
tlen = 0;
else
tlen = cis[i++];
} else {
if (cis[i] == CISTPL_NULL
|| cis[i] == CISTPL_END) {
tlen = 0;
tup = cis[i];
} else {
tlen = cis[i];
tup = CISTPL_BRCM_HNBU;
}
++i;
}
if ((i + tlen) >= CIS_SIZE)
break;
switch (tup) {
case CISTPL_VERS_1:
/* assume the strings are good if the version field checks out */
if (((cis[i + 1] << 8) + cis[i]) >= 0x0008) {
varbuf_append(&b, vstr_manf,
&cis[i + 2]);
varbuf_append(&b, vstr_productname,
&cis[i + 3 +
strlen((char *)
&cis[i +
2])]);
break;
}
case CISTPL_MANFID:
varbuf_append(&b, vstr_manfid,
(cis[i + 1] << 8) + cis[i]);
varbuf_append(&b, vstr_prodid,
(cis[i + 3] << 8) + cis[i + 2]);
break;
case CISTPL_FUNCID:
funcid = cis[i];
break;
case CISTPL_FUNCE:
switch (funcid) {
case CISTPL_FID_SDIO:
#ifdef BCMSDIO
if (cis[i] == 0) {
u8 spd = cis[i + 3];
static int base[] = {
-1, 10, 12, 13, 15, 20,
25, 30,
35, 40, 45, 50, 55, 60,
70, 80
};
static int mult[] = {
10, 100, 1000, 10000,
-1, -1, -1, -1
};
ASSERT((mult[spd & 0x7] != -1)
&&
(base
[(spd >> 3) & 0x0f]));
varbuf_append(&b,
vstr_sdmaxblk[0],
(cis[i + 2] << 8)
+ cis[i + 1]);
varbuf_append(&b,
vstr_sdmaxspeed,
(mult[spd & 0x7] *
base[(spd >> 3) &
0x0f]));
} else if (cis[i] == 1) {
varbuf_append(&b,
vstr_sdmaxblk
[cisnum],
(cis[i + 13] << 8)
| cis[i + 12]);
}
#endif /* BCMSDIO */
funcid = 0;
break;
default:
/* set macaddr if HNBU_MACADDR not seen yet */
if (eabuf[0] == '\0' &&
cis[i] == LAN_NID &&
!is_zero_ether_addr(&cis[i + 2]) &&
!is_multicast_ether_addr(&cis[i + 2])) {
ASSERT(cis[i + 1] ==
ETH_ALEN);
snprintf(eabuf, sizeof(eabuf),
"%pM", &cis[i + 2]);
/* set boardnum if HNBU_BOARDNUM not seen yet */
if (boardnum == -1)
boardnum =
(cis[i + 6] << 8) +
cis[i + 7];
}
break;
}
break;
case CISTPL_CFTABLE:
varbuf_append(&b, vstr_regwindowsz,
(cis[i + 7] << 8) | cis[i + 6]);
break;
case CISTPL_BRCM_HNBU:
switch (cis[i]) {
case HNBU_SROMREV:
sromrev = cis[i + 1];
varbuf_append(&b, vstr_sromrev,
sromrev);
break;
case HNBU_XTALFREQ:
varbuf_append(&b, vstr_xtalfreq,
(cis[i + 4] << 24) |
(cis[i + 3] << 16) |
(cis[i + 2] << 8) |
cis[i + 1]);
break;
case HNBU_CHIPID:
varbuf_append(&b, vstr_vendid,
(cis[i + 2] << 8) +
cis[i + 1]);
varbuf_append(&b, vstr_devid,
(cis[i + 4] << 8) +
cis[i + 3]);
if (tlen >= 7) {
varbuf_append(&b, vstr_chiprev,
(cis[i + 6] << 8)
+ cis[i + 5]);
}
if (tlen >= 9) {
varbuf_append(&b,
vstr_subvendid,
(cis[i + 8] << 8)
+ cis[i + 7]);
}
if (tlen >= 11) {
varbuf_append(&b, vstr_subdevid,
(cis[i + 10] << 8)
+ cis[i + 9]);
/* subdevid doubles for boardtype */
varbuf_append(&b,
vstr_boardtype,
(cis[i + 10] << 8)
+ cis[i + 9]);
}
break;
case HNBU_BOARDNUM:
boardnum =
(cis[i + 2] << 8) + cis[i + 1];
break;
case HNBU_PATCH:
{
char vstr_paddr[16];
char vstr_pdata[16];
/* retrieve the patch pairs
* from tlen/6; where 6 is
* sizeof(patch addr(2)) +
* sizeof(patch data(4)).
*/
patch_pair = tlen / 6;
for (j = 0; j < patch_pair; j++) {
snprintf(vstr_paddr,
sizeof
(vstr_paddr),
"pa%d=0x%%x",
j);
snprintf(vstr_pdata,
sizeof
(vstr_pdata),
"pd%d=0x%%x",
j);
varbuf_append(&b,
vstr_paddr,
(cis
[i +
(j *
6) +
2] << 8)
| cis[i +
(j *
6)
+
1]);
varbuf_append(&b,
vstr_pdata,
(cis
[i +
(j *
6) +
6] <<
24) |
(cis
[i +
(j *
6) +
5] <<
16) |
(cis
[i +
(j *
6) +
4] << 8)
| cis[i +
(j *
6)
+
3]);
}
}
break;
case HNBU_BOARDREV:
if (tlen == 2)
varbuf_append(&b, vstr_boardrev,
cis[i + 1]);
else
varbuf_append(&b, vstr_boardrev,
(cis[i + 2] << 8)
+ cis[i + 1]);
break;
case HNBU_BOARDFLAGS:
w32 = (cis[i + 2] << 8) + cis[i + 1];
if (tlen >= 5)
w32 |=
((cis[i + 4] << 24) +
(cis[i + 3] << 16));
varbuf_append(&b, vstr_boardflags, w32);
if (tlen >= 7) {
w32 =
(cis[i + 6] << 8) + cis[i +
5];
if (tlen >= 9)
w32 |=
((cis[i + 8] << 24)
+
(cis[i + 7] <<
16));
varbuf_append(&b,
vstr_boardflags2,
w32);
}
break;
case HNBU_USBFS:
varbuf_append(&b, vstr_usbfs,
cis[i + 1]);
break;
case HNBU_BOARDTYPE:
varbuf_append(&b, vstr_boardtype,
(cis[i + 2] << 8) +
cis[i + 1]);
break;
case HNBU_HNBUCIS:
/*
* what follows is a nonstandard HNBU CIS
* that lacks CISTPL_BRCM_HNBU tags
*
* skip 0xff (end of standard CIS)
* after this tuple
*/
tlen++;
standard_cis = false;
break;
case HNBU_USBEPNUM:
varbuf_append(&b, vstr_usbepnum,
(cis[i + 2] << 8) | cis[i
+
1]);
break;
case HNBU_AA:
varbuf_append(&b, vstr_aa2g,
cis[i + 1]);
if (tlen >= 3)
varbuf_append(&b, vstr_aa5g,
cis[i + 2]);
break;
case HNBU_AG:
varbuf_append(&b, vstr_ag, 0,
cis[i + 1]);
if (tlen >= 3)
varbuf_append(&b, vstr_ag, 1,
cis[i + 2]);
if (tlen >= 4)
varbuf_append(&b, vstr_ag, 2,
cis[i + 3]);
if (tlen >= 5)
varbuf_append(&b, vstr_ag, 3,
cis[i + 4]);
ag_init = true;
break;
case HNBU_ANT5G:
varbuf_append(&b, vstr_aa5g,
cis[i + 1]);
varbuf_append(&b, vstr_ag, 1,
cis[i + 2]);
break;
case HNBU_CC:
ASSERT(sromrev == 1);
varbuf_append(&b, vstr_cc, cis[i + 1]);
break;
case HNBU_PAPARMS:
switch (tlen) {
case 2:
ASSERT(sromrev == 1);
varbuf_append(&b,
vstr_pa0maxpwr,
cis[i + 1]);
break;
case 10:
ASSERT(sromrev >= 2);
varbuf_append(&b, vstr_opo,
cis[i + 9]);
/* FALLTHROUGH */
case 9:
varbuf_append(&b,
vstr_pa0maxpwr,
cis[i + 8]);
/* FALLTHROUGH */
BCMDONGLECASE(8)
varbuf_append(&b,
vstr_pa0itssit,
cis[i + 7]);
/* FALLTHROUGH */
BCMDONGLECASE(7)
for (j = 0; j < 3; j++) {
varbuf_append(&b,
vstr_pa0b
[j],
(cis
[i +
(j *
2) +
2] << 8)
+ cis[i +
(j *
2)
+
1]);
}
break;
default:
ASSERT((tlen == 2)
|| (tlen == 9)
|| (tlen == 10));
break;
}
break;
case HNBU_PAPARMS5G:
ASSERT((sromrev == 2)
|| (sromrev == 3));
switch (tlen) {
case 23:
varbuf_append(&b,
vstr_pa1himaxpwr,
cis[i + 22]);
varbuf_append(&b,
vstr_pa1lomaxpwr,
cis[i + 21]);
varbuf_append(&b,
vstr_pa1maxpwr,
cis[i + 20]);
/* FALLTHROUGH */
case 20:
varbuf_append(&b,
vstr_pa1itssit,
cis[i + 19]);
/* FALLTHROUGH */
case 19:
for (j = 0; j < 3; j++) {
varbuf_append(&b,
vstr_pa1b
[j],
(cis
[i +
(j *
2) +
2] << 8)
+ cis[i +
(j *
2)
+
1]);
}
for (j = 3; j < 6; j++) {
varbuf_append(&b,
vstr_pa1lob
[j - 3],
(cis
[i +
(j *
2) +
2] << 8)
+ cis[i +
(j *
2)
+
1]);
}
for (j = 6; j < 9; j++) {
varbuf_append(&b,
vstr_pa1hib
[j - 6],
(cis
[i +
(j *
2) +
2] << 8)
+ cis[i +
(j *
2)
+
1]);
}
break;
default:
ASSERT((tlen == 19) ||
(tlen == 20)
|| (tlen == 23));
break;
}
break;
case HNBU_OEM:
ASSERT(sromrev == 1);
varbuf_append(&b, vstr_oem,
cis[i + 1], cis[i + 2],
cis[i + 3], cis[i + 4],
cis[i + 5], cis[i + 6],
cis[i + 7], cis[i + 8]);
break;
case HNBU_LEDS:
for (j = 1; j <= 4; j++) {
if (cis[i + j] != 0xff) {
varbuf_append(&b,
vstr_ledbh,
j - 1,
cis[i +
j]);
}
}
break;
case HNBU_CCODE:
ASSERT(sromrev > 1);
if ((cis[i + 1] == 0)
|| (cis[i + 2] == 0))
varbuf_append(&b, vstr_noccode);
else
varbuf_append(&b, vstr_ccode,
cis[i + 1],
cis[i + 2]);
varbuf_append(&b, vstr_cctl,
cis[i + 3]);
break;
case HNBU_CCKPO:
ASSERT(sromrev > 2);
varbuf_append(&b, vstr_cckpo,
(cis[i + 2] << 8) | cis[i
+
1]);
break;
case HNBU_OFDMPO:
ASSERT(sromrev > 2);
varbuf_append(&b, vstr_ofdmpo,
(cis[i + 4] << 24) |
(cis[i + 3] << 16) |
(cis[i + 2] << 8) |
cis[i + 1]);
break;
case HNBU_WPS:
varbuf_append(&b, vstr_wpsgpio,
cis[i + 1]);
if (tlen >= 3)
varbuf_append(&b, vstr_wpsled,
cis[i + 2]);
break;
case HNBU_RSSISMBXA2G:
ASSERT(sromrev == 3);
varbuf_append(&b, vstr_rssismf2g,
cis[i + 1] & 0xf);
varbuf_append(&b, vstr_rssismc2g,
(cis[i + 1] >> 4) & 0xf);
varbuf_append(&b, vstr_rssisav2g,
cis[i + 2] & 0x7);
varbuf_append(&b, vstr_bxa2g,
(cis[i + 2] >> 3) & 0x3);
break;
case HNBU_RSSISMBXA5G:
ASSERT(sromrev == 3);
varbuf_append(&b, vstr_rssismf5g,
cis[i + 1] & 0xf);
varbuf_append(&b, vstr_rssismc5g,
(cis[i + 1] >> 4) & 0xf);
varbuf_append(&b, vstr_rssisav5g,
cis[i + 2] & 0x7);
varbuf_append(&b, vstr_bxa5g,
(cis[i + 2] >> 3) & 0x3);
break;
case HNBU_TRI2G:
ASSERT(sromrev == 3);
varbuf_append(&b, vstr_tri2g,
cis[i + 1]);
break;
case HNBU_TRI5G:
ASSERT(sromrev == 3);
varbuf_append(&b, vstr_tri5gl,
cis[i + 1]);
varbuf_append(&b, vstr_tri5g,
cis[i + 2]);
varbuf_append(&b, vstr_tri5gh,
cis[i + 3]);
break;
case HNBU_RXPO2G:
ASSERT(sromrev == 3);
varbuf_append(&b, vstr_rxpo2g,
cis[i + 1]);
break;
case HNBU_RXPO5G:
ASSERT(sromrev == 3);
varbuf_append(&b, vstr_rxpo5g,
cis[i + 1]);
break;
case HNBU_MACADDR:
if (!is_zero_ether_addr(&cis[i + 1]) &&
!is_multicast_ether_addr(&cis[i + 1])) {
snprintf(eabuf, sizeof(eabuf),
"%pM", &cis[i + 1]);
/* set boardnum if HNBU_BOARDNUM not seen yet */
if (boardnum == -1)
boardnum =
(cis[i + 5] << 8) +
cis[i + 6];
}
break;
case HNBU_LEDDC:
/* CIS leddc only has 16bits, convert it to 32bits */
w32 = ((cis[i + 2] << 24) | /* oncount */
(cis[i + 1] << 8)); /* offcount */
varbuf_append(&b, vstr_leddc, w32);
break;
case HNBU_CHAINSWITCH:
varbuf_append(&b, vstr_txchain,
cis[i + 1]);
varbuf_append(&b, vstr_rxchain,
cis[i + 2]);
varbuf_append(&b, vstr_antswitch,
(cis[i + 4] << 8) +
cis[i + 3]);
break;
case HNBU_REGREV:
varbuf_append(&b, vstr_regrev,
cis[i + 1]);
break;
case HNBU_FEM:{
u16 fem =
(cis[i + 2] << 8) + cis[i +
1];
varbuf_append(&b,
vstr_antswctl2g,
(fem &
SROM8_FEM_ANTSWLUT_MASK)
>>
SROM8_FEM_ANTSWLUT_SHIFT);
varbuf_append(&b, vstr_triso2g,
(fem &
SROM8_FEM_TR_ISO_MASK)
>>
SROM8_FEM_TR_ISO_SHIFT);
varbuf_append(&b,
vstr_pdetrange2g,
(fem &
SROM8_FEM_PDET_RANGE_MASK)
>>
SROM8_FEM_PDET_RANGE_SHIFT);
varbuf_append(&b,
vstr_extpagain2g,
(fem &
SROM8_FEM_EXTPA_GAIN_MASK)
>>
SROM8_FEM_EXTPA_GAIN_SHIFT);
varbuf_append(&b,
vstr_tssipos2g,
(fem &
SROM8_FEM_TSSIPOS_MASK)
>>
SROM8_FEM_TSSIPOS_SHIFT);
if (tlen < 5)
break;
fem =
(cis[i + 4] << 8) + cis[i +
3];
varbuf_append(&b,
vstr_antswctl5g,
(fem &
SROM8_FEM_ANTSWLUT_MASK)
>>
SROM8_FEM_ANTSWLUT_SHIFT);
varbuf_append(&b, vstr_triso5g,
(fem &
SROM8_FEM_TR_ISO_MASK)
>>
SROM8_FEM_TR_ISO_SHIFT);
varbuf_append(&b,
vstr_pdetrange5g,
(fem &
SROM8_FEM_PDET_RANGE_MASK)
>>
SROM8_FEM_PDET_RANGE_SHIFT);
varbuf_append(&b,
vstr_extpagain5g,
(fem &
SROM8_FEM_EXTPA_GAIN_MASK)
>>
SROM8_FEM_EXTPA_GAIN_SHIFT);
varbuf_append(&b,
vstr_tssipos5g,
(fem &
SROM8_FEM_TSSIPOS_MASK)
>>
SROM8_FEM_TSSIPOS_SHIFT);
break;
}
case HNBU_PAPARMS_C0:
varbuf_append(&b, vstr_maxp2ga0,
cis[i + 1]);
varbuf_append(&b, vstr_itt2ga0,
cis[i + 2]);
varbuf_append(&b, vstr_pa, 2, 0, 0,
(cis[i + 4] << 8) +
cis[i + 3]);
varbuf_append(&b, vstr_pa, 2, 1, 0,
(cis[i + 6] << 8) +
cis[i + 5]);
varbuf_append(&b, vstr_pa, 2, 2, 0,
(cis[i + 8] << 8) +
cis[i + 7]);
if (tlen < 31)
break;
varbuf_append(&b, vstr_maxp5ga0,
cis[i + 9]);
varbuf_append(&b, vstr_itt5ga0,
cis[i + 10]);
varbuf_append(&b, vstr_maxp5gha0,
cis[i + 11]);
varbuf_append(&b, vstr_maxp5gla0,
cis[i + 12]);
varbuf_append(&b, vstr_pa, 5, 0, 0,
(cis[i + 14] << 8) +
cis[i + 13]);
varbuf_append(&b, vstr_pa, 5, 1, 0,
(cis[i + 16] << 8) +
cis[i + 15]);
varbuf_append(&b, vstr_pa, 5, 2, 0,
(cis[i + 18] << 8) +
cis[i + 17]);
varbuf_append(&b, vstr_pahl, 5, 'l', 0,
0,
(cis[i + 20] << 8) +
cis[i + 19]);
varbuf_append(&b, vstr_pahl, 5, 'l', 1,
0,
(cis[i + 22] << 8) +
cis[i + 21]);
varbuf_append(&b, vstr_pahl, 5, 'l', 2,
0,
(cis[i + 24] << 8) +
cis[i + 23]);
varbuf_append(&b, vstr_pahl, 5, 'h', 0,
0,
(cis[i + 26] << 8) +
cis[i + 25]);
varbuf_append(&b, vstr_pahl, 5, 'h', 1,
0,
(cis[i + 28] << 8) +
cis[i + 27]);
varbuf_append(&b, vstr_pahl, 5, 'h', 2,
0,
(cis[i + 30] << 8) +
cis[i + 29]);
break;
case HNBU_PAPARMS_C1:
varbuf_append(&b, vstr_maxp2ga1,
cis[i + 1]);
varbuf_append(&b, vstr_itt2ga1,
cis[i + 2]);
varbuf_append(&b, vstr_pa, 2, 0, 1,
(cis[i + 4] << 8) +
cis[i + 3]);
varbuf_append(&b, vstr_pa, 2, 1, 1,
(cis[i + 6] << 8) +
cis[i + 5]);
varbuf_append(&b, vstr_pa, 2, 2, 1,
(cis[i + 8] << 8) +
cis[i + 7]);
if (tlen < 31)
break;
varbuf_append(&b, vstr_maxp5ga1,
cis[i + 9]);
varbuf_append(&b, vstr_itt5ga1,
cis[i + 10]);
varbuf_append(&b, vstr_maxp5gha1,
cis[i + 11]);
varbuf_append(&b, vstr_maxp5gla1,
cis[i + 12]);
varbuf_append(&b, vstr_pa, 5, 0, 1,
(cis[i + 14] << 8) +
cis[i + 13]);
varbuf_append(&b, vstr_pa, 5, 1, 1,
(cis[i + 16] << 8) +
cis[i + 15]);
varbuf_append(&b, vstr_pa, 5, 2, 1,
(cis[i + 18] << 8) +
cis[i + 17]);
varbuf_append(&b, vstr_pahl, 5, 'l', 0,
1,
(cis[i + 20] << 8) +
cis[i + 19]);
varbuf_append(&b, vstr_pahl, 5, 'l', 1,
1,
(cis[i + 22] << 8) +
cis[i + 21]);
varbuf_append(&b, vstr_pahl, 5, 'l', 2,
1,
(cis[i + 24] << 8) +
cis[i + 23]);
varbuf_append(&b, vstr_pahl, 5, 'h', 0,
1,
(cis[i + 26] << 8) +
cis[i + 25]);
varbuf_append(&b, vstr_pahl, 5, 'h', 1,
1,
(cis[i + 28] << 8) +
cis[i + 27]);
varbuf_append(&b, vstr_pahl, 5, 'h', 2,
1,
(cis[i + 30] << 8) +
cis[i + 29]);
break;
case HNBU_PO_CCKOFDM:
varbuf_append(&b, vstr_cck2gpo,
(cis[i + 2] << 8) +
cis[i + 1]);
varbuf_append(&b, vstr_ofdm2gpo,
(cis[i + 6] << 24) +
(cis[i + 5] << 16) +
(cis[i + 4] << 8) +
cis[i + 3]);
if (tlen < 19)
break;
varbuf_append(&b, vstr_ofdm5gpo,
(cis[i + 10] << 24) +
(cis[i + 9] << 16) +
(cis[i + 8] << 8) +
cis[i + 7]);
varbuf_append(&b, vstr_ofdm5glpo,
(cis[i + 14] << 24) +
(cis[i + 13] << 16) +
(cis[i + 12] << 8) +
cis[i + 11]);
varbuf_append(&b, vstr_ofdm5ghpo,
(cis[i + 18] << 24) +
(cis[i + 17] << 16) +
(cis[i + 16] << 8) +
cis[i + 15]);
break;
case HNBU_PO_MCS2G:
for (j = 0; j <= (tlen / 2); j++) {
varbuf_append(&b, vstr_mcspo, 2,
j,
(cis
[i + 2 +
2 * j] << 8) +
cis[i + 1 +
2 * j]);
}
break;
case HNBU_PO_MCS5GM:
for (j = 0; j <= (tlen / 2); j++) {
varbuf_append(&b, vstr_mcspo, 5,
j,
(cis
[i + 2 +
2 * j] << 8) +
cis[i + 1 +
2 * j]);
}
break;
case HNBU_PO_MCS5GLH:
for (j = 0; j <= (tlen / 4); j++) {
varbuf_append(&b, vstr_mcspohl,
5, 'l', j,
(cis
[i + 2 +
2 * j] << 8) +
cis[i + 1 +
2 * j]);
}
for (j = 0; j <= (tlen / 4); j++) {
varbuf_append(&b, vstr_mcspohl,
5, 'h', j,
(cis
[i +
((tlen / 2) +
2) +
2 * j] << 8) +
cis[i +
((tlen / 2) +
1) + 2 * j]);
}
break;
case HNBU_PO_CDD:
varbuf_append(&b, vstr_cddpo,
(cis[i + 2] << 8) +
cis[i + 1]);
break;
case HNBU_PO_STBC:
varbuf_append(&b, vstr_stbcpo,
(cis[i + 2] << 8) +
cis[i + 1]);
break;
case HNBU_PO_40M:
varbuf_append(&b, vstr_bw40po,
(cis[i + 2] << 8) +
cis[i + 1]);
break;
case HNBU_PO_40MDUP:
varbuf_append(&b, vstr_bwduppo,
(cis[i + 2] << 8) +
cis[i + 1]);
break;
case HNBU_OFDMPO5G:
varbuf_append(&b, vstr_ofdm5gpo,
(cis[i + 4] << 24) +
(cis[i + 3] << 16) +
(cis[i + 2] << 8) +
cis[i + 1]);
varbuf_append(&b, vstr_ofdm5glpo,
(cis[i + 8] << 24) +
(cis[i + 7] << 16) +
(cis[i + 6] << 8) +
cis[i + 5]);
varbuf_append(&b, vstr_ofdm5ghpo,
(cis[i + 12] << 24) +
(cis[i + 11] << 16) +
(cis[i + 10] << 8) +
cis[i + 9]);
break;
case HNBU_CUSTOM1:
varbuf_append(&b, vstr_custom, 1,
((cis[i + 4] << 24) +
(cis[i + 3] << 16) +
(cis[i + 2] << 8) +
cis[i + 1]));
break;
#if defined(BCMSDIO)
case HNBU_SROM3SWRGN:
if (tlen >= 73) {
u16 srom[35];
u8 srev = cis[i + 1 + 70];
ASSERT(srev == 3);
/* make tuple value 16-bit aligned and parse it */
memcpy(srom, &cis[i + 1],
sizeof(srom));
_initvars_srom_pci(srev, srom,
SROM3_SWRGN_OFF,
&b);
/* 2.4G antenna gain is included in SROM */
ag_init = true;
/* Ethernet MAC address is included in SROM */
eabuf[0] = 0;
boardnum = -1;
}
/* create extra variables */
if (tlen >= 75)
varbuf_append(&b, vstr_vendid,
(cis[i + 1 + 73]
<< 8) + cis[i +
1 +
72]);
if (tlen >= 77)
varbuf_append(&b, vstr_devid,
(cis[i + 1 + 75]
<< 8) + cis[i +
1 +
74]);
if (tlen >= 79)
varbuf_append(&b, vstr_xtalfreq,
(cis[i + 1 + 77]
<< 8) + cis[i +
1 +
76]);
break;
#endif /* defined(BCMSDIO) */
case HNBU_CCKFILTTYPE:
varbuf_append(&b, vstr_cckdigfilttype,
(cis[i + 1]));
break;
}
break;
}
i += tlen;
} while (tup != CISTPL_END);
}
if (boardnum != -1) {
varbuf_append(&b, vstr_boardnum, boardnum);
}
if (eabuf[0]) {
varbuf_append(&b, vstr_macaddr, eabuf);
}
/* if there is no antenna gain field, set default */
if (getvar(NULL, "ag0") == NULL && ag_init == false) {
varbuf_append(&b, vstr_ag, 0, 0xff);
}
/* final nullbyte terminator */
ASSERT(b.size >= 1);
*b.buf++ = '\0';
ASSERT(b.buf - base <= MAXSZ_NVRAM_VARS);
err = initvars_table(base, b.buf, vars, count);
kfree(base);
return err;
}
/* In chips with chipcommon rev 32 and later, the srom is in chipcommon,
* not in the bus cores.
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment