Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.10 754 lines 30 kB view raw
1/* 2 * Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org> 3 * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 4 * Copyright (C) 2006 Michael Buesch <m@bues.ch> 5 * Copyright (C) 2010 Waldemar Brodkorb <wbx@openadk.org> 6 * Copyright (C) 2010-2012 Hauke Mehrtens <hauke@hauke-m.de> 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2 of the License, or (at your 11 * option) any later version. 12 * 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 14 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 15 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 16 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 19 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * 24 * You should have received a copy of the GNU General Public License along 25 * with this program; if not, write to the Free Software Foundation, Inc., 26 * 675 Mass Ave, Cambridge, MA 02139, USA. 27 */ 28 29#include <bcm47xx.h> 30#include <bcm47xx_nvram.h> 31 32static void create_key(const char *prefix, const char *postfix, 33 const char *name, char *buf, int len) 34{ 35 if (prefix && postfix) 36 snprintf(buf, len, "%s%s%s", prefix, name, postfix); 37 else if (prefix) 38 snprintf(buf, len, "%s%s", prefix, name); 39 else if (postfix) 40 snprintf(buf, len, "%s%s", name, postfix); 41 else 42 snprintf(buf, len, "%s", name); 43} 44 45static int get_nvram_var(const char *prefix, const char *postfix, 46 const char *name, char *buf, int len, bool fallback) 47{ 48 char key[40]; 49 int err; 50 51 create_key(prefix, postfix, name, key, sizeof(key)); 52 53 err = bcm47xx_nvram_getenv(key, buf, len); 54 if (fallback && err == -ENOENT && prefix) { 55 create_key(NULL, postfix, name, key, sizeof(key)); 56 err = bcm47xx_nvram_getenv(key, buf, len); 57 } 58 return err; 59} 60 61#define NVRAM_READ_VAL(type) \ 62static void nvram_read_ ## type (const char *prefix, \ 63 const char *postfix, const char *name, \ 64 type *val, type allset, bool fallback) \ 65{ \ 66 char buf[100]; \ 67 int err; \ 68 type var; \ 69 \ 70 err = get_nvram_var(prefix, postfix, name, buf, sizeof(buf), \ 71 fallback); \ 72 if (err < 0) \ 73 return; \ 74 err = kstrto ## type(strim(buf), 0, &var); \ 75 if (err) { \ 76 pr_warn("can not parse nvram name %s%s%s with value %s got %i\n", \ 77 prefix, name, postfix, buf, err); \ 78 return; \ 79 } \ 80 if (allset && var == allset) \ 81 return; \ 82 *val = var; \ 83} 84 85NVRAM_READ_VAL(u8) 86NVRAM_READ_VAL(s8) 87NVRAM_READ_VAL(u16) 88NVRAM_READ_VAL(u32) 89 90#undef NVRAM_READ_VAL 91 92static void nvram_read_u32_2(const char *prefix, const char *name, 93 u16 *val_lo, u16 *val_hi, bool fallback) 94{ 95 char buf[100]; 96 int err; 97 u32 val; 98 99 err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback); 100 if (err < 0) 101 return; 102 err = kstrtou32(strim(buf), 0, &val); 103 if (err) { 104 pr_warn("can not parse nvram name %s%s with value %s got %i\n", 105 prefix, name, buf, err); 106 return; 107 } 108 *val_lo = (val & 0x0000FFFFU); 109 *val_hi = (val & 0xFFFF0000U) >> 16; 110} 111 112static void nvram_read_leddc(const char *prefix, const char *name, 113 u8 *leddc_on_time, u8 *leddc_off_time, 114 bool fallback) 115{ 116 char buf[100]; 117 int err; 118 u32 val; 119 120 err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback); 121 if (err < 0) 122 return; 123 err = kstrtou32(strim(buf), 0, &val); 124 if (err) { 125 pr_warn("can not parse nvram name %s%s with value %s got %i\n", 126 prefix, name, buf, err); 127 return; 128 } 129 130 if (val == 0xffff || val == 0xffffffff) 131 return; 132 133 *leddc_on_time = val & 0xff; 134 *leddc_off_time = (val >> 16) & 0xff; 135} 136 137static void nvram_read_macaddr(const char *prefix, const char *name, 138 u8 (*val)[6], bool fallback) 139{ 140 char buf[100]; 141 int err; 142 143 err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback); 144 if (err < 0) 145 return; 146 147 bcm47xx_nvram_parse_macaddr(buf, *val); 148} 149 150static void nvram_read_alpha2(const char *prefix, const char *name, 151 char (*val)[2], bool fallback) 152{ 153 char buf[10]; 154 int err; 155 156 err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback); 157 if (err < 0) 158 return; 159 if (buf[0] == '0') 160 return; 161 if (strlen(buf) > 2) { 162 pr_warn("alpha2 is too long %s\n", buf); 163 return; 164 } 165 memcpy(val, buf, sizeof(val)); 166} 167 168static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom, 169 const char *prefix, bool fallback) 170{ 171 nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff, fallback); 172 nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback); 173 nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback); 174 nvram_read_u8(prefix, NULL, "ledbh3", &sprom->gpio3, 0xff, fallback); 175 nvram_read_u8(prefix, NULL, "aa2g", &sprom->ant_available_bg, 0, 176 fallback); 177 nvram_read_u8(prefix, NULL, "aa5g", &sprom->ant_available_a, 0, 178 fallback); 179 nvram_read_s8(prefix, NULL, "ag0", &sprom->antenna_gain.a0, 0, 180 fallback); 181 nvram_read_s8(prefix, NULL, "ag1", &sprom->antenna_gain.a1, 0, 182 fallback); 183 nvram_read_alpha2(prefix, "ccode", &sprom->alpha2, fallback); 184} 185 186static void bcm47xx_fill_sprom_r12389(struct ssb_sprom *sprom, 187 const char *prefix, bool fallback) 188{ 189 nvram_read_u16(prefix, NULL, "pa0b0", &sprom->pa0b0, 0, fallback); 190 nvram_read_u16(prefix, NULL, "pa0b1", &sprom->pa0b1, 0, fallback); 191 nvram_read_u16(prefix, NULL, "pa0b2", &sprom->pa0b2, 0, fallback); 192 nvram_read_u8(prefix, NULL, "pa0itssit", &sprom->itssi_bg, 0, fallback); 193 nvram_read_u8(prefix, NULL, "pa0maxpwr", &sprom->maxpwr_bg, 0, 194 fallback); 195 nvram_read_u16(prefix, NULL, "pa1b0", &sprom->pa1b0, 0, fallback); 196 nvram_read_u16(prefix, NULL, "pa1b1", &sprom->pa1b1, 0, fallback); 197 nvram_read_u16(prefix, NULL, "pa1b2", &sprom->pa1b2, 0, fallback); 198 nvram_read_u8(prefix, NULL, "pa1itssit", &sprom->itssi_a, 0, fallback); 199 nvram_read_u8(prefix, NULL, "pa1maxpwr", &sprom->maxpwr_a, 0, fallback); 200} 201 202static void bcm47xx_fill_sprom_r1(struct ssb_sprom *sprom, const char *prefix, 203 bool fallback) 204{ 205 nvram_read_u16(prefix, NULL, "boardflags", &sprom->boardflags_lo, 0, 206 fallback); 207 nvram_read_u8(prefix, NULL, "cc", &sprom->country_code, 0, fallback); 208} 209 210static void bcm47xx_fill_sprom_r2389(struct ssb_sprom *sprom, 211 const char *prefix, bool fallback) 212{ 213 nvram_read_u8(prefix, NULL, "opo", &sprom->opo, 0, fallback); 214 nvram_read_u16(prefix, NULL, "pa1lob0", &sprom->pa1lob0, 0, fallback); 215 nvram_read_u16(prefix, NULL, "pa1lob1", &sprom->pa1lob1, 0, fallback); 216 nvram_read_u16(prefix, NULL, "pa1lob2", &sprom->pa1lob2, 0, fallback); 217 nvram_read_u16(prefix, NULL, "pa1hib0", &sprom->pa1hib0, 0, fallback); 218 nvram_read_u16(prefix, NULL, "pa1hib1", &sprom->pa1hib1, 0, fallback); 219 nvram_read_u16(prefix, NULL, "pa1hib2", &sprom->pa1hib2, 0, fallback); 220 nvram_read_u8(prefix, NULL, "pa1lomaxpwr", &sprom->maxpwr_al, 0, 221 fallback); 222 nvram_read_u8(prefix, NULL, "pa1himaxpwr", &sprom->maxpwr_ah, 0, 223 fallback); 224} 225 226static void bcm47xx_fill_sprom_r389(struct ssb_sprom *sprom, const char *prefix, 227 bool fallback) 228{ 229 nvram_read_u8(prefix, NULL, "bxa2g", &sprom->bxa2g, 0, fallback); 230 nvram_read_u8(prefix, NULL, "rssisav2g", &sprom->rssisav2g, 0, 231 fallback); 232 nvram_read_u8(prefix, NULL, "rssismc2g", &sprom->rssismc2g, 0, 233 fallback); 234 nvram_read_u8(prefix, NULL, "rssismf2g", &sprom->rssismf2g, 0, 235 fallback); 236 nvram_read_u8(prefix, NULL, "bxa5g", &sprom->bxa5g, 0, fallback); 237 nvram_read_u8(prefix, NULL, "rssisav5g", &sprom->rssisav5g, 0, 238 fallback); 239 nvram_read_u8(prefix, NULL, "rssismc5g", &sprom->rssismc5g, 0, 240 fallback); 241 nvram_read_u8(prefix, NULL, "rssismf5g", &sprom->rssismf5g, 0, 242 fallback); 243 nvram_read_u8(prefix, NULL, "tri2g", &sprom->tri2g, 0, fallback); 244 nvram_read_u8(prefix, NULL, "tri5g", &sprom->tri5g, 0, fallback); 245 nvram_read_u8(prefix, NULL, "tri5gl", &sprom->tri5gl, 0, fallback); 246 nvram_read_u8(prefix, NULL, "tri5gh", &sprom->tri5gh, 0, fallback); 247 nvram_read_s8(prefix, NULL, "rxpo2g", &sprom->rxpo2g, 0, fallback); 248 nvram_read_s8(prefix, NULL, "rxpo5g", &sprom->rxpo5g, 0, fallback); 249} 250 251static void bcm47xx_fill_sprom_r3(struct ssb_sprom *sprom, const char *prefix, 252 bool fallback) 253{ 254 nvram_read_u8(prefix, NULL, "regrev", &sprom->regrev, 0, fallback); 255 nvram_read_leddc(prefix, "leddc", &sprom->leddc_on_time, 256 &sprom->leddc_off_time, fallback); 257} 258 259static void bcm47xx_fill_sprom_r4589(struct ssb_sprom *sprom, 260 const char *prefix, bool fallback) 261{ 262 nvram_read_u8(prefix, NULL, "regrev", &sprom->regrev, 0, fallback); 263 nvram_read_s8(prefix, NULL, "ag2", &sprom->antenna_gain.a2, 0, 264 fallback); 265 nvram_read_s8(prefix, NULL, "ag3", &sprom->antenna_gain.a3, 0, 266 fallback); 267 nvram_read_u8(prefix, NULL, "txchain", &sprom->txchain, 0xf, fallback); 268 nvram_read_u8(prefix, NULL, "rxchain", &sprom->rxchain, 0xf, fallback); 269 nvram_read_u8(prefix, NULL, "antswitch", &sprom->antswitch, 0xff, 270 fallback); 271 nvram_read_leddc(prefix, "leddc", &sprom->leddc_on_time, 272 &sprom->leddc_off_time, fallback); 273} 274 275static void bcm47xx_fill_sprom_r458(struct ssb_sprom *sprom, const char *prefix, 276 bool fallback) 277{ 278 nvram_read_u16(prefix, NULL, "cck2gpo", &sprom->cck2gpo, 0, fallback); 279 nvram_read_u32(prefix, NULL, "ofdm2gpo", &sprom->ofdm2gpo, 0, fallback); 280 nvram_read_u32(prefix, NULL, "ofdm5gpo", &sprom->ofdm5gpo, 0, fallback); 281 nvram_read_u32(prefix, NULL, "ofdm5glpo", &sprom->ofdm5glpo, 0, 282 fallback); 283 nvram_read_u32(prefix, NULL, "ofdm5ghpo", &sprom->ofdm5ghpo, 0, 284 fallback); 285 nvram_read_u16(prefix, NULL, "cddpo", &sprom->cddpo, 0, fallback); 286 nvram_read_u16(prefix, NULL, "stbcpo", &sprom->stbcpo, 0, fallback); 287 nvram_read_u16(prefix, NULL, "bw40po", &sprom->bw40po, 0, fallback); 288 nvram_read_u16(prefix, NULL, "bwduppo", &sprom->bwduppo, 0, fallback); 289 nvram_read_u16(prefix, NULL, "mcs2gpo0", &sprom->mcs2gpo[0], 0, 290 fallback); 291 nvram_read_u16(prefix, NULL, "mcs2gpo1", &sprom->mcs2gpo[1], 0, 292 fallback); 293 nvram_read_u16(prefix, NULL, "mcs2gpo2", &sprom->mcs2gpo[2], 0, 294 fallback); 295 nvram_read_u16(prefix, NULL, "mcs2gpo3", &sprom->mcs2gpo[3], 0, 296 fallback); 297 nvram_read_u16(prefix, NULL, "mcs2gpo4", &sprom->mcs2gpo[4], 0, 298 fallback); 299 nvram_read_u16(prefix, NULL, "mcs2gpo5", &sprom->mcs2gpo[5], 0, 300 fallback); 301 nvram_read_u16(prefix, NULL, "mcs2gpo6", &sprom->mcs2gpo[6], 0, 302 fallback); 303 nvram_read_u16(prefix, NULL, "mcs2gpo7", &sprom->mcs2gpo[7], 0, 304 fallback); 305 nvram_read_u16(prefix, NULL, "mcs5gpo0", &sprom->mcs5gpo[0], 0, 306 fallback); 307 nvram_read_u16(prefix, NULL, "mcs5gpo1", &sprom->mcs5gpo[1], 0, 308 fallback); 309 nvram_read_u16(prefix, NULL, "mcs5gpo2", &sprom->mcs5gpo[2], 0, 310 fallback); 311 nvram_read_u16(prefix, NULL, "mcs5gpo3", &sprom->mcs5gpo[3], 0, 312 fallback); 313 nvram_read_u16(prefix, NULL, "mcs5gpo4", &sprom->mcs5gpo[4], 0, 314 fallback); 315 nvram_read_u16(prefix, NULL, "mcs5gpo5", &sprom->mcs5gpo[5], 0, 316 fallback); 317 nvram_read_u16(prefix, NULL, "mcs5gpo6", &sprom->mcs5gpo[6], 0, 318 fallback); 319 nvram_read_u16(prefix, NULL, "mcs5gpo7", &sprom->mcs5gpo[7], 0, 320 fallback); 321 nvram_read_u16(prefix, NULL, "mcs5glpo0", &sprom->mcs5glpo[0], 0, 322 fallback); 323 nvram_read_u16(prefix, NULL, "mcs5glpo1", &sprom->mcs5glpo[1], 0, 324 fallback); 325 nvram_read_u16(prefix, NULL, "mcs5glpo2", &sprom->mcs5glpo[2], 0, 326 fallback); 327 nvram_read_u16(prefix, NULL, "mcs5glpo3", &sprom->mcs5glpo[3], 0, 328 fallback); 329 nvram_read_u16(prefix, NULL, "mcs5glpo4", &sprom->mcs5glpo[4], 0, 330 fallback); 331 nvram_read_u16(prefix, NULL, "mcs5glpo5", &sprom->mcs5glpo[5], 0, 332 fallback); 333 nvram_read_u16(prefix, NULL, "mcs5glpo6", &sprom->mcs5glpo[6], 0, 334 fallback); 335 nvram_read_u16(prefix, NULL, "mcs5glpo7", &sprom->mcs5glpo[7], 0, 336 fallback); 337 nvram_read_u16(prefix, NULL, "mcs5ghpo0", &sprom->mcs5ghpo[0], 0, 338 fallback); 339 nvram_read_u16(prefix, NULL, "mcs5ghpo1", &sprom->mcs5ghpo[1], 0, 340 fallback); 341 nvram_read_u16(prefix, NULL, "mcs5ghpo2", &sprom->mcs5ghpo[2], 0, 342 fallback); 343 nvram_read_u16(prefix, NULL, "mcs5ghpo3", &sprom->mcs5ghpo[3], 0, 344 fallback); 345 nvram_read_u16(prefix, NULL, "mcs5ghpo4", &sprom->mcs5ghpo[4], 0, 346 fallback); 347 nvram_read_u16(prefix, NULL, "mcs5ghpo5", &sprom->mcs5ghpo[5], 0, 348 fallback); 349 nvram_read_u16(prefix, NULL, "mcs5ghpo6", &sprom->mcs5ghpo[6], 0, 350 fallback); 351 nvram_read_u16(prefix, NULL, "mcs5ghpo7", &sprom->mcs5ghpo[7], 0, 352 fallback); 353} 354 355static void bcm47xx_fill_sprom_r45(struct ssb_sprom *sprom, const char *prefix, 356 bool fallback) 357{ 358 nvram_read_u8(prefix, NULL, "txpid2ga0", &sprom->txpid2g[0], 0, 359 fallback); 360 nvram_read_u8(prefix, NULL, "txpid2ga1", &sprom->txpid2g[1], 0, 361 fallback); 362 nvram_read_u8(prefix, NULL, "txpid2ga2", &sprom->txpid2g[2], 0, 363 fallback); 364 nvram_read_u8(prefix, NULL, "txpid2ga3", &sprom->txpid2g[3], 0, 365 fallback); 366 nvram_read_u8(prefix, NULL, "txpid5ga0", &sprom->txpid5g[0], 0, 367 fallback); 368 nvram_read_u8(prefix, NULL, "txpid5ga1", &sprom->txpid5g[1], 0, 369 fallback); 370 nvram_read_u8(prefix, NULL, "txpid5ga2", &sprom->txpid5g[2], 0, 371 fallback); 372 nvram_read_u8(prefix, NULL, "txpid5ga3", &sprom->txpid5g[3], 0, 373 fallback); 374 nvram_read_u8(prefix, NULL, "txpid5gla0", &sprom->txpid5gl[0], 0, 375 fallback); 376 nvram_read_u8(prefix, NULL, "txpid5gla1", &sprom->txpid5gl[1], 0, 377 fallback); 378 nvram_read_u8(prefix, NULL, "txpid5gla2", &sprom->txpid5gl[2], 0, 379 fallback); 380 nvram_read_u8(prefix, NULL, "txpid5gla3", &sprom->txpid5gl[3], 0, 381 fallback); 382 nvram_read_u8(prefix, NULL, "txpid5gha0", &sprom->txpid5gh[0], 0, 383 fallback); 384 nvram_read_u8(prefix, NULL, "txpid5gha1", &sprom->txpid5gh[1], 0, 385 fallback); 386 nvram_read_u8(prefix, NULL, "txpid5gha2", &sprom->txpid5gh[2], 0, 387 fallback); 388 nvram_read_u8(prefix, NULL, "txpid5gha3", &sprom->txpid5gh[3], 0, 389 fallback); 390} 391 392static void bcm47xx_fill_sprom_r89(struct ssb_sprom *sprom, const char *prefix, 393 bool fallback) 394{ 395 nvram_read_u8(prefix, NULL, "tssipos2g", &sprom->fem.ghz2.tssipos, 0, 396 fallback); 397 nvram_read_u8(prefix, NULL, "extpagain2g", 398 &sprom->fem.ghz2.extpa_gain, 0, fallback); 399 nvram_read_u8(prefix, NULL, "pdetrange2g", 400 &sprom->fem.ghz2.pdet_range, 0, fallback); 401 nvram_read_u8(prefix, NULL, "triso2g", &sprom->fem.ghz2.tr_iso, 0, 402 fallback); 403 nvram_read_u8(prefix, NULL, "antswctl2g", &sprom->fem.ghz2.antswlut, 0, 404 fallback); 405 nvram_read_u8(prefix, NULL, "tssipos5g", &sprom->fem.ghz5.tssipos, 0, 406 fallback); 407 nvram_read_u8(prefix, NULL, "extpagain5g", 408 &sprom->fem.ghz5.extpa_gain, 0, fallback); 409 nvram_read_u8(prefix, NULL, "pdetrange5g", 410 &sprom->fem.ghz5.pdet_range, 0, fallback); 411 nvram_read_u8(prefix, NULL, "triso5g", &sprom->fem.ghz5.tr_iso, 0, 412 fallback); 413 nvram_read_u8(prefix, NULL, "antswctl5g", &sprom->fem.ghz5.antswlut, 0, 414 fallback); 415 nvram_read_u8(prefix, NULL, "tempthresh", &sprom->tempthresh, 0, 416 fallback); 417 nvram_read_u8(prefix, NULL, "tempoffset", &sprom->tempoffset, 0, 418 fallback); 419 nvram_read_u16(prefix, NULL, "rawtempsense", &sprom->rawtempsense, 0, 420 fallback); 421 nvram_read_u8(prefix, NULL, "measpower", &sprom->measpower, 0, 422 fallback); 423 nvram_read_u8(prefix, NULL, "tempsense_slope", 424 &sprom->tempsense_slope, 0, fallback); 425 nvram_read_u8(prefix, NULL, "tempcorrx", &sprom->tempcorrx, 0, 426 fallback); 427 nvram_read_u8(prefix, NULL, "tempsense_option", 428 &sprom->tempsense_option, 0, fallback); 429 nvram_read_u8(prefix, NULL, "freqoffset_corr", 430 &sprom->freqoffset_corr, 0, fallback); 431 nvram_read_u8(prefix, NULL, "iqcal_swp_dis", &sprom->iqcal_swp_dis, 0, 432 fallback); 433 nvram_read_u8(prefix, NULL, "hw_iqcal_en", &sprom->hw_iqcal_en, 0, 434 fallback); 435 nvram_read_u8(prefix, NULL, "elna2g", &sprom->elna2g, 0, fallback); 436 nvram_read_u8(prefix, NULL, "elna5g", &sprom->elna5g, 0, fallback); 437 nvram_read_u8(prefix, NULL, "phycal_tempdelta", 438 &sprom->phycal_tempdelta, 0, fallback); 439 nvram_read_u8(prefix, NULL, "temps_period", &sprom->temps_period, 0, 440 fallback); 441 nvram_read_u8(prefix, NULL, "temps_hysteresis", 442 &sprom->temps_hysteresis, 0, fallback); 443 nvram_read_u8(prefix, NULL, "measpower1", &sprom->measpower1, 0, 444 fallback); 445 nvram_read_u8(prefix, NULL, "measpower2", &sprom->measpower2, 0, 446 fallback); 447 nvram_read_u8(prefix, NULL, "rxgainerr2ga0", 448 &sprom->rxgainerr2ga[0], 0, fallback); 449 nvram_read_u8(prefix, NULL, "rxgainerr2ga1", 450 &sprom->rxgainerr2ga[1], 0, fallback); 451 nvram_read_u8(prefix, NULL, "rxgainerr2ga2", 452 &sprom->rxgainerr2ga[2], 0, fallback); 453 nvram_read_u8(prefix, NULL, "rxgainerr5gla0", 454 &sprom->rxgainerr5gla[0], 0, fallback); 455 nvram_read_u8(prefix, NULL, "rxgainerr5gla1", 456 &sprom->rxgainerr5gla[1], 0, fallback); 457 nvram_read_u8(prefix, NULL, "rxgainerr5gla2", 458 &sprom->rxgainerr5gla[2], 0, fallback); 459 nvram_read_u8(prefix, NULL, "rxgainerr5gma0", 460 &sprom->rxgainerr5gma[0], 0, fallback); 461 nvram_read_u8(prefix, NULL, "rxgainerr5gma1", 462 &sprom->rxgainerr5gma[1], 0, fallback); 463 nvram_read_u8(prefix, NULL, "rxgainerr5gma2", 464 &sprom->rxgainerr5gma[2], 0, fallback); 465 nvram_read_u8(prefix, NULL, "rxgainerr5gha0", 466 &sprom->rxgainerr5gha[0], 0, fallback); 467 nvram_read_u8(prefix, NULL, "rxgainerr5gha1", 468 &sprom->rxgainerr5gha[1], 0, fallback); 469 nvram_read_u8(prefix, NULL, "rxgainerr5gha2", 470 &sprom->rxgainerr5gha[2], 0, fallback); 471 nvram_read_u8(prefix, NULL, "rxgainerr5gua0", 472 &sprom->rxgainerr5gua[0], 0, fallback); 473 nvram_read_u8(prefix, NULL, "rxgainerr5gua1", 474 &sprom->rxgainerr5gua[1], 0, fallback); 475 nvram_read_u8(prefix, NULL, "rxgainerr5gua2", 476 &sprom->rxgainerr5gua[2], 0, fallback); 477 nvram_read_u8(prefix, NULL, "noiselvl2ga0", &sprom->noiselvl2ga[0], 0, 478 fallback); 479 nvram_read_u8(prefix, NULL, "noiselvl2ga1", &sprom->noiselvl2ga[1], 0, 480 fallback); 481 nvram_read_u8(prefix, NULL, "noiselvl2ga2", &sprom->noiselvl2ga[2], 0, 482 fallback); 483 nvram_read_u8(prefix, NULL, "noiselvl5gla0", 484 &sprom->noiselvl5gla[0], 0, fallback); 485 nvram_read_u8(prefix, NULL, "noiselvl5gla1", 486 &sprom->noiselvl5gla[1], 0, fallback); 487 nvram_read_u8(prefix, NULL, "noiselvl5gla2", 488 &sprom->noiselvl5gla[2], 0, fallback); 489 nvram_read_u8(prefix, NULL, "noiselvl5gma0", 490 &sprom->noiselvl5gma[0], 0, fallback); 491 nvram_read_u8(prefix, NULL, "noiselvl5gma1", 492 &sprom->noiselvl5gma[1], 0, fallback); 493 nvram_read_u8(prefix, NULL, "noiselvl5gma2", 494 &sprom->noiselvl5gma[2], 0, fallback); 495 nvram_read_u8(prefix, NULL, "noiselvl5gha0", 496 &sprom->noiselvl5gha[0], 0, fallback); 497 nvram_read_u8(prefix, NULL, "noiselvl5gha1", 498 &sprom->noiselvl5gha[1], 0, fallback); 499 nvram_read_u8(prefix, NULL, "noiselvl5gha2", 500 &sprom->noiselvl5gha[2], 0, fallback); 501 nvram_read_u8(prefix, NULL, "noiselvl5gua0", 502 &sprom->noiselvl5gua[0], 0, fallback); 503 nvram_read_u8(prefix, NULL, "noiselvl5gua1", 504 &sprom->noiselvl5gua[1], 0, fallback); 505 nvram_read_u8(prefix, NULL, "noiselvl5gua2", 506 &sprom->noiselvl5gua[2], 0, fallback); 507 nvram_read_u8(prefix, NULL, "pcieingress_war", 508 &sprom->pcieingress_war, 0, fallback); 509} 510 511static void bcm47xx_fill_sprom_r9(struct ssb_sprom *sprom, const char *prefix, 512 bool fallback) 513{ 514 nvram_read_u16(prefix, NULL, "cckbw202gpo", &sprom->cckbw202gpo, 0, 515 fallback); 516 nvram_read_u16(prefix, NULL, "cckbw20ul2gpo", &sprom->cckbw20ul2gpo, 0, 517 fallback); 518 nvram_read_u32(prefix, NULL, "legofdmbw202gpo", 519 &sprom->legofdmbw202gpo, 0, fallback); 520 nvram_read_u32(prefix, NULL, "legofdmbw20ul2gpo", 521 &sprom->legofdmbw20ul2gpo, 0, fallback); 522 nvram_read_u32(prefix, NULL, "legofdmbw205glpo", 523 &sprom->legofdmbw205glpo, 0, fallback); 524 nvram_read_u32(prefix, NULL, "legofdmbw20ul5glpo", 525 &sprom->legofdmbw20ul5glpo, 0, fallback); 526 nvram_read_u32(prefix, NULL, "legofdmbw205gmpo", 527 &sprom->legofdmbw205gmpo, 0, fallback); 528 nvram_read_u32(prefix, NULL, "legofdmbw20ul5gmpo", 529 &sprom->legofdmbw20ul5gmpo, 0, fallback); 530 nvram_read_u32(prefix, NULL, "legofdmbw205ghpo", 531 &sprom->legofdmbw205ghpo, 0, fallback); 532 nvram_read_u32(prefix, NULL, "legofdmbw20ul5ghpo", 533 &sprom->legofdmbw20ul5ghpo, 0, fallback); 534 nvram_read_u32(prefix, NULL, "mcsbw202gpo", &sprom->mcsbw202gpo, 0, 535 fallback); 536 nvram_read_u32(prefix, NULL, "mcsbw20ul2gpo", &sprom->mcsbw20ul2gpo, 0, 537 fallback); 538 nvram_read_u32(prefix, NULL, "mcsbw402gpo", &sprom->mcsbw402gpo, 0, 539 fallback); 540 nvram_read_u32(prefix, NULL, "mcsbw205glpo", &sprom->mcsbw205glpo, 0, 541 fallback); 542 nvram_read_u32(prefix, NULL, "mcsbw20ul5glpo", 543 &sprom->mcsbw20ul5glpo, 0, fallback); 544 nvram_read_u32(prefix, NULL, "mcsbw405glpo", &sprom->mcsbw405glpo, 0, 545 fallback); 546 nvram_read_u32(prefix, NULL, "mcsbw205gmpo", &sprom->mcsbw205gmpo, 0, 547 fallback); 548 nvram_read_u32(prefix, NULL, "mcsbw20ul5gmpo", 549 &sprom->mcsbw20ul5gmpo, 0, fallback); 550 nvram_read_u32(prefix, NULL, "mcsbw405gmpo", &sprom->mcsbw405gmpo, 0, 551 fallback); 552 nvram_read_u32(prefix, NULL, "mcsbw205ghpo", &sprom->mcsbw205ghpo, 0, 553 fallback); 554 nvram_read_u32(prefix, NULL, "mcsbw20ul5ghpo", 555 &sprom->mcsbw20ul5ghpo, 0, fallback); 556 nvram_read_u32(prefix, NULL, "mcsbw405ghpo", &sprom->mcsbw405ghpo, 0, 557 fallback); 558 nvram_read_u16(prefix, NULL, "mcs32po", &sprom->mcs32po, 0, fallback); 559 nvram_read_u16(prefix, NULL, "legofdm40duppo", 560 &sprom->legofdm40duppo, 0, fallback); 561 nvram_read_u8(prefix, NULL, "sar2g", &sprom->sar2g, 0, fallback); 562 nvram_read_u8(prefix, NULL, "sar5g", &sprom->sar5g, 0, fallback); 563} 564 565static void bcm47xx_fill_sprom_path_r4589(struct ssb_sprom *sprom, 566 const char *prefix, bool fallback) 567{ 568 char postfix[2]; 569 int i; 570 571 for (i = 0; i < ARRAY_SIZE(sprom->core_pwr_info); i++) { 572 struct ssb_sprom_core_pwr_info *pwr_info = &sprom->core_pwr_info[i]; 573 snprintf(postfix, sizeof(postfix), "%i", i); 574 nvram_read_u8(prefix, postfix, "maxp2ga", 575 &pwr_info->maxpwr_2g, 0, fallback); 576 nvram_read_u8(prefix, postfix, "itt2ga", 577 &pwr_info->itssi_2g, 0, fallback); 578 nvram_read_u8(prefix, postfix, "itt5ga", 579 &pwr_info->itssi_5g, 0, fallback); 580 nvram_read_u16(prefix, postfix, "pa2gw0a", 581 &pwr_info->pa_2g[0], 0, fallback); 582 nvram_read_u16(prefix, postfix, "pa2gw1a", 583 &pwr_info->pa_2g[1], 0, fallback); 584 nvram_read_u16(prefix, postfix, "pa2gw2a", 585 &pwr_info->pa_2g[2], 0, fallback); 586 nvram_read_u8(prefix, postfix, "maxp5ga", 587 &pwr_info->maxpwr_5g, 0, fallback); 588 nvram_read_u8(prefix, postfix, "maxp5gha", 589 &pwr_info->maxpwr_5gh, 0, fallback); 590 nvram_read_u8(prefix, postfix, "maxp5gla", 591 &pwr_info->maxpwr_5gl, 0, fallback); 592 nvram_read_u16(prefix, postfix, "pa5gw0a", 593 &pwr_info->pa_5g[0], 0, fallback); 594 nvram_read_u16(prefix, postfix, "pa5gw1a", 595 &pwr_info->pa_5g[1], 0, fallback); 596 nvram_read_u16(prefix, postfix, "pa5gw2a", 597 &pwr_info->pa_5g[2], 0, fallback); 598 nvram_read_u16(prefix, postfix, "pa5glw0a", 599 &pwr_info->pa_5gl[0], 0, fallback); 600 nvram_read_u16(prefix, postfix, "pa5glw1a", 601 &pwr_info->pa_5gl[1], 0, fallback); 602 nvram_read_u16(prefix, postfix, "pa5glw2a", 603 &pwr_info->pa_5gl[2], 0, fallback); 604 nvram_read_u16(prefix, postfix, "pa5ghw0a", 605 &pwr_info->pa_5gh[0], 0, fallback); 606 nvram_read_u16(prefix, postfix, "pa5ghw1a", 607 &pwr_info->pa_5gh[1], 0, fallback); 608 nvram_read_u16(prefix, postfix, "pa5ghw2a", 609 &pwr_info->pa_5gh[2], 0, fallback); 610 } 611} 612 613static void bcm47xx_fill_sprom_path_r45(struct ssb_sprom *sprom, 614 const char *prefix, bool fallback) 615{ 616 char postfix[2]; 617 int i; 618 619 for (i = 0; i < ARRAY_SIZE(sprom->core_pwr_info); i++) { 620 struct ssb_sprom_core_pwr_info *pwr_info = &sprom->core_pwr_info[i]; 621 snprintf(postfix, sizeof(postfix), "%i", i); 622 nvram_read_u16(prefix, postfix, "pa2gw3a", 623 &pwr_info->pa_2g[3], 0, fallback); 624 nvram_read_u16(prefix, postfix, "pa5gw3a", 625 &pwr_info->pa_5g[3], 0, fallback); 626 nvram_read_u16(prefix, postfix, "pa5glw3a", 627 &pwr_info->pa_5gl[3], 0, fallback); 628 nvram_read_u16(prefix, postfix, "pa5ghw3a", 629 &pwr_info->pa_5gh[3], 0, fallback); 630 } 631} 632 633static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom, 634 const char *prefix, bool fallback) 635{ 636 nvram_read_macaddr(prefix, "et0macaddr", &sprom->et0mac, fallback); 637 nvram_read_u8(prefix, NULL, "et0mdcport", &sprom->et0mdcport, 0, 638 fallback); 639 nvram_read_u8(prefix, NULL, "et0phyaddr", &sprom->et0phyaddr, 0, 640 fallback); 641 642 nvram_read_macaddr(prefix, "et1macaddr", &sprom->et1mac, fallback); 643 nvram_read_u8(prefix, NULL, "et1mdcport", &sprom->et1mdcport, 0, 644 fallback); 645 nvram_read_u8(prefix, NULL, "et1phyaddr", &sprom->et1phyaddr, 0, 646 fallback); 647 648 nvram_read_macaddr(prefix, "macaddr", &sprom->il0mac, fallback); 649 nvram_read_macaddr(prefix, "il0macaddr", &sprom->il0mac, fallback); 650} 651 652static void bcm47xx_fill_board_data(struct ssb_sprom *sprom, const char *prefix, 653 bool fallback) 654{ 655 nvram_read_u16(prefix, NULL, "boardrev", &sprom->board_rev, 0, true); 656 nvram_read_u16(prefix, NULL, "boardnum", &sprom->board_num, 0, 657 fallback); 658 nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0, true); 659 nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo, 660 &sprom->boardflags_hi, fallback); 661 nvram_read_u32_2(prefix, "boardflags2", &sprom->boardflags2_lo, 662 &sprom->boardflags2_hi, fallback); 663} 664 665void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix, 666 bool fallback) 667{ 668 bcm47xx_fill_sprom_ethernet(sprom, prefix, fallback); 669 bcm47xx_fill_board_data(sprom, prefix, fallback); 670 671 nvram_read_u8(prefix, NULL, "sromrev", &sprom->revision, 0, fallback); 672 673 switch (sprom->revision) { 674 case 1: 675 bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback); 676 bcm47xx_fill_sprom_r12389(sprom, prefix, fallback); 677 bcm47xx_fill_sprom_r1(sprom, prefix, fallback); 678 break; 679 case 2: 680 bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback); 681 bcm47xx_fill_sprom_r12389(sprom, prefix, fallback); 682 bcm47xx_fill_sprom_r2389(sprom, prefix, fallback); 683 break; 684 case 3: 685 bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback); 686 bcm47xx_fill_sprom_r12389(sprom, prefix, fallback); 687 bcm47xx_fill_sprom_r2389(sprom, prefix, fallback); 688 bcm47xx_fill_sprom_r389(sprom, prefix, fallback); 689 bcm47xx_fill_sprom_r3(sprom, prefix, fallback); 690 break; 691 case 4: 692 case 5: 693 bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback); 694 bcm47xx_fill_sprom_r4589(sprom, prefix, fallback); 695 bcm47xx_fill_sprom_r458(sprom, prefix, fallback); 696 bcm47xx_fill_sprom_r45(sprom, prefix, fallback); 697 bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback); 698 bcm47xx_fill_sprom_path_r45(sprom, prefix, fallback); 699 break; 700 case 8: 701 bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback); 702 bcm47xx_fill_sprom_r12389(sprom, prefix, fallback); 703 bcm47xx_fill_sprom_r2389(sprom, prefix, fallback); 704 bcm47xx_fill_sprom_r389(sprom, prefix, fallback); 705 bcm47xx_fill_sprom_r4589(sprom, prefix, fallback); 706 bcm47xx_fill_sprom_r458(sprom, prefix, fallback); 707 bcm47xx_fill_sprom_r89(sprom, prefix, fallback); 708 bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback); 709 break; 710 case 9: 711 bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback); 712 bcm47xx_fill_sprom_r12389(sprom, prefix, fallback); 713 bcm47xx_fill_sprom_r2389(sprom, prefix, fallback); 714 bcm47xx_fill_sprom_r389(sprom, prefix, fallback); 715 bcm47xx_fill_sprom_r4589(sprom, prefix, fallback); 716 bcm47xx_fill_sprom_r89(sprom, prefix, fallback); 717 bcm47xx_fill_sprom_r9(sprom, prefix, fallback); 718 bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback); 719 break; 720 default: 721 pr_warn("Unsupported SPROM revision %d detected. Will extract" 722 " v1\n", sprom->revision); 723 sprom->revision = 1; 724 bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback); 725 bcm47xx_fill_sprom_r12389(sprom, prefix, fallback); 726 bcm47xx_fill_sprom_r1(sprom, prefix, fallback); 727 } 728} 729 730#ifdef CONFIG_BCM47XX_SSB 731void bcm47xx_fill_ssb_boardinfo(struct ssb_boardinfo *boardinfo, 732 const char *prefix) 733{ 734 nvram_read_u16(prefix, NULL, "boardvendor", &boardinfo->vendor, 0, 735 true); 736 if (!boardinfo->vendor) 737 boardinfo->vendor = SSB_BOARDVENDOR_BCM; 738 739 nvram_read_u16(prefix, NULL, "boardtype", &boardinfo->type, 0, true); 740} 741#endif 742 743#ifdef CONFIG_BCM47XX_BCMA 744void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo, 745 const char *prefix) 746{ 747 nvram_read_u16(prefix, NULL, "boardvendor", &boardinfo->vendor, 0, 748 true); 749 if (!boardinfo->vendor) 750 boardinfo->vendor = SSB_BOARDVENDOR_BCM; 751 752 nvram_read_u16(prefix, NULL, "boardtype", &boardinfo->type, 0, true); 753} 754#endif