extractedLnx/linux-2.6.38/drivers/staging/brcm80211/util/bcmsrom.c_srom_parsecis.c
int srom_parsecis(struct osl_info *osh, 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 */
bcopy(&cis[i + 1], srom,
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(osh, base, b.buf, vars, count);
kfree(base);
return err;
}
Generated by GNU enscript 1.6.4.