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

bcma/ssb: parse new attributes from sprom

These newly added attributes are used by brcmsmac. Now bcma should
parse all attributes used by brcmsmac out of the sprom.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Tested-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Hauke Mehrtens and committed by
John W. Linville
e2da4bd3 432c4d1e

+194 -4
+70
drivers/bcma/sprom.c
··· 185 185 bus->sprom._field = ((((u32)sprom[SPOFF((_offset)+2)] << 16 | \ 186 186 sprom[SPOFF(_offset)]) & (_mask)) >> (_shift)) 187 187 188 + #define SPEX_ARRAY8(_field, _offset, _mask, _shift) \ 189 + do { \ 190 + SPEX(_field[0], _offset + 0, _mask, _shift); \ 191 + SPEX(_field[1], _offset + 2, _mask, _shift); \ 192 + SPEX(_field[2], _offset + 4, _mask, _shift); \ 193 + SPEX(_field[3], _offset + 6, _mask, _shift); \ 194 + SPEX(_field[4], _offset + 8, _mask, _shift); \ 195 + SPEX(_field[5], _offset + 10, _mask, _shift); \ 196 + SPEX(_field[6], _offset + 12, _mask, _shift); \ 197 + SPEX(_field[7], _offset + 14, _mask, _shift); \ 198 + } while (0) 199 + 188 200 static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) 189 201 { 190 202 u16 v, o; ··· 387 375 SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); 388 376 SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23, 389 377 SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); 378 + 379 + SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, 380 + SSB_SPROM8_LEDDC_ON_SHIFT); 381 + SPEX(leddc_off_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_OFF, 382 + SSB_SPROM8_LEDDC_OFF_SHIFT); 383 + 384 + SPEX(txchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_TXCHAIN, 385 + SSB_SPROM8_TXRXC_TXCHAIN_SHIFT); 386 + SPEX(rxchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_RXCHAIN, 387 + SSB_SPROM8_TXRXC_RXCHAIN_SHIFT); 388 + SPEX(antswitch, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_SWITCH, 389 + SSB_SPROM8_TXRXC_SWITCH_SHIFT); 390 + 391 + SPEX(opo, SSB_SPROM8_OFDM2GPO, 0x00ff, 0); 392 + 393 + SPEX_ARRAY8(mcs2gpo, SSB_SPROM8_2G_MCSPO, ~0, 0); 394 + SPEX_ARRAY8(mcs5gpo, SSB_SPROM8_5G_MCSPO, ~0, 0); 395 + SPEX_ARRAY8(mcs5glpo, SSB_SPROM8_5GL_MCSPO, ~0, 0); 396 + SPEX_ARRAY8(mcs5ghpo, SSB_SPROM8_5GH_MCSPO, ~0, 0); 397 + 398 + SPEX(rawtempsense, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_RAWTEMP, 399 + SSB_SPROM8_RAWTS_RAWTEMP_SHIFT); 400 + SPEX(measpower, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_MEASPOWER, 401 + SSB_SPROM8_RAWTS_MEASPOWER_SHIFT); 402 + SPEX(tempsense_slope, SSB_SPROM8_OPT_CORRX, 403 + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE, 404 + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT); 405 + SPEX(tempcorrx, SSB_SPROM8_OPT_CORRX, SSB_SPROM8_OPT_CORRX_TEMPCORRX, 406 + SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT); 407 + SPEX(tempsense_option, SSB_SPROM8_OPT_CORRX, 408 + SSB_SPROM8_OPT_CORRX_TEMP_OPTION, 409 + SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT); 410 + SPEX(freqoffset_corr, SSB_SPROM8_HWIQ_IQSWP, 411 + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR, 412 + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT); 413 + SPEX(iqcal_swp_dis, SSB_SPROM8_HWIQ_IQSWP, 414 + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP, 415 + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT); 416 + SPEX(hw_iqcal_en, SSB_SPROM8_HWIQ_IQSWP, SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL, 417 + SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT); 418 + 419 + SPEX(bw40po, SSB_SPROM8_BW40PO, ~0, 0); 420 + SPEX(cddpo, SSB_SPROM8_CDDPO, ~0, 0); 421 + SPEX(stbcpo, SSB_SPROM8_STBCPO, ~0, 0); 422 + SPEX(bwduppo, SSB_SPROM8_BWDUPPO, ~0, 0); 423 + 424 + SPEX(tempthresh, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_TRESH, 425 + SSB_SPROM8_THERMAL_TRESH_SHIFT); 426 + SPEX(tempoffset, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_OFFSET, 427 + SSB_SPROM8_THERMAL_OFFSET_SHIFT); 428 + SPEX(phycal_tempdelta, SSB_SPROM8_TEMPDELTA, 429 + SSB_SPROM8_TEMPDELTA_PHYCAL, 430 + SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT); 431 + SPEX(temps_period, SSB_SPROM8_TEMPDELTA, SSB_SPROM8_TEMPDELTA_PERIOD, 432 + SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT); 433 + SPEX(temps_hysteresis, SSB_SPROM8_TEMPDELTA, 434 + SSB_SPROM8_TEMPDELTA_HYSTERESIS, 435 + SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT); 390 436 } 391 437 392 438 /*
+69
drivers/ssb/pci.c
··· 178 178 #define SPEX(_outvar, _offset, _mask, _shift) \ 179 179 SPEX16(_outvar, _offset, _mask, _shift) 180 180 181 + #define SPEX_ARRAY8(_field, _offset, _mask, _shift) \ 182 + do { \ 183 + SPEX(_field[0], _offset + 0, _mask, _shift); \ 184 + SPEX(_field[1], _offset + 2, _mask, _shift); \ 185 + SPEX(_field[2], _offset + 4, _mask, _shift); \ 186 + SPEX(_field[3], _offset + 6, _mask, _shift); \ 187 + SPEX(_field[4], _offset + 8, _mask, _shift); \ 188 + SPEX(_field[5], _offset + 10, _mask, _shift); \ 189 + SPEX(_field[6], _offset + 12, _mask, _shift); \ 190 + SPEX(_field[7], _offset + 14, _mask, _shift); \ 191 + } while (0) 192 + 181 193 182 194 static inline u8 ssb_crc8(u8 crc, u8 data) 183 195 { ··· 675 663 SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G, 676 664 SSB_SROM8_FEM_ANTSWLUT, SSB_SROM8_FEM_ANTSWLUT_SHIFT); 677 665 666 + SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, 667 + SSB_SPROM8_LEDDC_ON_SHIFT); 668 + SPEX(leddc_off_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_OFF, 669 + SSB_SPROM8_LEDDC_OFF_SHIFT); 670 + 671 + SPEX(txchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_TXCHAIN, 672 + SSB_SPROM8_TXRXC_TXCHAIN_SHIFT); 673 + SPEX(rxchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_RXCHAIN, 674 + SSB_SPROM8_TXRXC_RXCHAIN_SHIFT); 675 + SPEX(antswitch, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_SWITCH, 676 + SSB_SPROM8_TXRXC_SWITCH_SHIFT); 677 + 678 + SPEX(opo, SSB_SPROM8_OFDM2GPO, 0x00ff, 0); 679 + 680 + SPEX_ARRAY8(mcs2gpo, SSB_SPROM8_2G_MCSPO, ~0, 0); 681 + SPEX_ARRAY8(mcs5gpo, SSB_SPROM8_5G_MCSPO, ~0, 0); 682 + SPEX_ARRAY8(mcs5glpo, SSB_SPROM8_5GL_MCSPO, ~0, 0); 683 + SPEX_ARRAY8(mcs5ghpo, SSB_SPROM8_5GH_MCSPO, ~0, 0); 684 + 685 + SPEX(rawtempsense, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_RAWTEMP, 686 + SSB_SPROM8_RAWTS_RAWTEMP_SHIFT); 687 + SPEX(measpower, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_MEASPOWER, 688 + SSB_SPROM8_RAWTS_MEASPOWER_SHIFT); 689 + SPEX(tempsense_slope, SSB_SPROM8_OPT_CORRX, 690 + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE, 691 + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT); 692 + SPEX(tempcorrx, SSB_SPROM8_OPT_CORRX, SSB_SPROM8_OPT_CORRX_TEMPCORRX, 693 + SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT); 694 + SPEX(tempsense_option, SSB_SPROM8_OPT_CORRX, 695 + SSB_SPROM8_OPT_CORRX_TEMP_OPTION, 696 + SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT); 697 + SPEX(freqoffset_corr, SSB_SPROM8_HWIQ_IQSWP, 698 + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR, 699 + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT); 700 + SPEX(iqcal_swp_dis, SSB_SPROM8_HWIQ_IQSWP, 701 + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP, 702 + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT); 703 + SPEX(hw_iqcal_en, SSB_SPROM8_HWIQ_IQSWP, SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL, 704 + SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT); 705 + 706 + SPEX(bw40po, SSB_SPROM8_BW40PO, ~0, 0); 707 + SPEX(cddpo, SSB_SPROM8_CDDPO, ~0, 0); 708 + SPEX(stbcpo, SSB_SPROM8_STBCPO, ~0, 0); 709 + SPEX(bwduppo, SSB_SPROM8_BWDUPPO, ~0, 0); 710 + 711 + SPEX(tempthresh, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_TRESH, 712 + SSB_SPROM8_THERMAL_TRESH_SHIFT); 713 + SPEX(tempoffset, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_OFFSET, 714 + SSB_SPROM8_THERMAL_OFFSET_SHIFT); 715 + SPEX(phycal_tempdelta, SSB_SPROM8_TEMPDELTA, 716 + SSB_SPROM8_TEMPDELTA_PHYCAL, 717 + SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT); 718 + SPEX(temps_period, SSB_SPROM8_TEMPDELTA, SSB_SPROM8_TEMPDELTA_PERIOD, 719 + SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT); 720 + SPEX(temps_hysteresis, SSB_SPROM8_TEMPDELTA, 721 + SSB_SPROM8_TEMPDELTA_HYSTERESIS, 722 + SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT); 678 723 sprom_extract_r458(out, in); 679 724 680 725 /* TODO - get remaining rev 8 stuff needed */
+55 -4
include/linux/ssb/ssb_regs.h
··· 391 391 #define SSB_SPROM8_GPIOB_P2 0x00FF /* Pin 2 */ 392 392 #define SSB_SPROM8_GPIOB_P3 0xFF00 /* Pin 3 */ 393 393 #define SSB_SPROM8_GPIOB_P3_SHIFT 8 394 + #define SSB_SPROM8_LEDDC 0x009A 395 + #define SSB_SPROM8_LEDDC_ON 0xFF00 /* oncount */ 396 + #define SSB_SPROM8_LEDDC_ON_SHIFT 8 397 + #define SSB_SPROM8_LEDDC_OFF 0x00FF /* offcount */ 398 + #define SSB_SPROM8_LEDDC_OFF_SHIFT 0 394 399 #define SSB_SPROM8_ANTAVAIL 0x009C /* Antenna available bitfields*/ 395 400 #define SSB_SPROM8_ANTAVAIL_A 0xFF00 /* A-PHY bitfield */ 396 401 #define SSB_SPROM8_ANTAVAIL_A_SHIFT 8 ··· 411 406 #define SSB_SPROM8_AGAIN2_SHIFT 0 412 407 #define SSB_SPROM8_AGAIN3 0xFF00 /* Antenna 3 */ 413 408 #define SSB_SPROM8_AGAIN3_SHIFT 8 409 + #define SSB_SPROM8_TXRXC 0x00A2 410 + #define SSB_SPROM8_TXRXC_TXCHAIN 0x000f 411 + #define SSB_SPROM8_TXRXC_TXCHAIN_SHIFT 0 412 + #define SSB_SPROM8_TXRXC_RXCHAIN 0x00f0 413 + #define SSB_SPROM8_TXRXC_RXCHAIN_SHIFT 4 414 + #define SSB_SPROM8_TXRXC_SWITCH 0xff00 415 + #define SSB_SPROM8_TXRXC_SWITCH_SHIFT 8 414 416 #define SSB_SPROM8_RSSIPARM2G 0x00A4 /* RSSI params for 2GHz */ 415 417 #define SSB_SPROM8_RSSISMF2G 0x000F 416 418 #define SSB_SPROM8_RSSISMC2G 0x00F0 ··· 444 432 #define SSB_SPROM8_TRI5GH_SHIFT 8 445 433 #define SSB_SPROM8_RXPO 0x00AC /* RX power offsets */ 446 434 #define SSB_SPROM8_RXPO2G 0x00FF /* 2GHz RX power offset */ 435 + #define SSB_SPROM8_RXPO2G_SHIFT 0 447 436 #define SSB_SPROM8_RXPO5G 0xFF00 /* 5GHz RX power offset */ 448 437 #define SSB_SPROM8_RXPO5G_SHIFT 8 449 438 #define SSB_SPROM8_FEM2G 0x00AE ··· 460 447 #define SSB_SROM8_FEM_ANTSWLUT 0xF800 461 448 #define SSB_SROM8_FEM_ANTSWLUT_SHIFT 11 462 449 #define SSB_SPROM8_THERMAL 0x00B2 463 - #define SSB_SPROM8_MPWR_RAWTS 0x00B4 464 - #define SSB_SPROM8_TS_SLP_OPT_CORRX 0x00B6 465 - #define SSB_SPROM8_FOC_HWIQ_IQSWP 0x00B8 466 - #define SSB_SPROM8_PHYCAL_TEMPDELTA 0x00BA 450 + #define SSB_SPROM8_THERMAL_OFFSET 0x00ff 451 + #define SSB_SPROM8_THERMAL_OFFSET_SHIFT 0 452 + #define SSB_SPROM8_THERMAL_TRESH 0xff00 453 + #define SSB_SPROM8_THERMAL_TRESH_SHIFT 8 454 + /* Temp sense related entries */ 455 + #define SSB_SPROM8_RAWTS 0x00B4 456 + #define SSB_SPROM8_RAWTS_RAWTEMP 0x01ff 457 + #define SSB_SPROM8_RAWTS_RAWTEMP_SHIFT 0 458 + #define SSB_SPROM8_RAWTS_MEASPOWER 0xfe00 459 + #define SSB_SPROM8_RAWTS_MEASPOWER_SHIFT 9 460 + #define SSB_SPROM8_OPT_CORRX 0x00B6 461 + #define SSB_SPROM8_OPT_CORRX_TEMP_SLOPE 0x00ff 462 + #define SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT 0 463 + #define SSB_SPROM8_OPT_CORRX_TEMPCORRX 0xfc00 464 + #define SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT 10 465 + #define SSB_SPROM8_OPT_CORRX_TEMP_OPTION 0x0300 466 + #define SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT 8 467 + /* FOC: freiquency offset correction, HWIQ: H/W IOCAL enable, IQSWP: IQ CAL swap disable */ 468 + #define SSB_SPROM8_HWIQ_IQSWP 0x00B8 469 + #define SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR 0x000f 470 + #define SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT 0 471 + #define SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP 0x0010 472 + #define SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT 4 473 + #define SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL 0x0020 474 + #define SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT 5 475 + #define SSB_SPROM8_TEMPDELTA 0x00BA 476 + #define SSB_SPROM8_TEMPDELTA_PHYCAL 0x00ff 477 + #define SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT 0 478 + #define SSB_SPROM8_TEMPDELTA_PERIOD 0x0f00 479 + #define SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT 8 480 + #define SSB_SPROM8_TEMPDELTA_HYSTERESIS 0xf000 481 + #define SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT 12 467 482 468 483 /* There are 4 blocks with power info sharing the same layout */ 469 484 #define SSB_SROM8_PWR_INFO_CORE0 0x00C0 ··· 555 514 #define SSB_SPROM8_OFDM5GPO 0x0146 /* 5.3GHz OFDM power offset */ 556 515 #define SSB_SPROM8_OFDM5GLPO 0x014A /* 5.2GHz OFDM power offset */ 557 516 #define SSB_SPROM8_OFDM5GHPO 0x014E /* 5.8GHz OFDM power offset */ 517 + 518 + #define SSB_SPROM8_2G_MCSPO 0x0152 519 + #define SSB_SPROM8_5G_MCSPO 0x0162 520 + #define SSB_SPROM8_5GL_MCSPO 0x0172 521 + #define SSB_SPROM8_5GH_MCSPO 0x0182 522 + 523 + #define SSB_SPROM8_CDDPO 0x0192 524 + #define SSB_SPROM8_STBCPO 0x0194 525 + #define SSB_SPROM8_BW40PO 0x0196 526 + #define SSB_SPROM8_BWDUPPO 0x0198 558 527 559 528 /* Values for boardflags_lo read from SPROM */ 560 529 #define SSB_BFL_BTCOEXIST 0x0001 /* implements Bluetooth coexistance */