Commit f679056b2fdd4e9b7c8eb42ba447cd9646236305
Committed by
John W. Linville
1 parent
18889231e4
ssb: Implement the remaining rev.8 SPROM vars needed for LP-PHY
Also add a "SPEX32" macro for extracting 32-bit SPROM variables. Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Showing 3 changed files with 148 additions and 15 deletions Side-by-side Diff
drivers/ssb/pci.c
... | ... | @@ -169,9 +169,15 @@ |
169 | 169 | /* Get the word-offset for a SSB_SPROM_XXX define. */ |
170 | 170 | #define SPOFF(offset) (((offset) - SSB_SPROM_BASE) / sizeof(u16)) |
171 | 171 | /* Helper to extract some _offset, which is one of the SSB_SPROM_XXX defines. */ |
172 | -#define SPEX(_outvar, _offset, _mask, _shift) \ | |
172 | +#define SPEX16(_outvar, _offset, _mask, _shift) \ | |
173 | 173 | out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) |
174 | +#define SPEX32(_outvar, _offset, _mask, _shift) \ | |
175 | + out->_outvar = ((((u32)in[SPOFF((_offset)+2)] << 16 | \ | |
176 | + in[SPOFF(_offset)]) & (_mask)) >> (_shift)) | |
177 | +#define SPEX(_outvar, _offset, _mask, _shift) \ | |
178 | + SPEX16(_outvar, _offset, _mask, _shift) | |
174 | 179 | |
180 | + | |
175 | 181 | static inline u8 ssb_crc8(u8 crc, u8 data) |
176 | 182 | { |
177 | 183 | /* Polynomial: x^8 + x^7 + x^6 + x^4 + x^2 + 1 */ |
... | ... | @@ -480,6 +486,8 @@ |
480 | 486 | SPEX(country_code, SSB_SPROM8_CCODE, 0xFFFF, 0); |
481 | 487 | SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0); |
482 | 488 | SPEX(boardflags_hi, SSB_SPROM8_BFLHI, 0xFFFF, 0); |
489 | + SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, 0xFFFF, 0); | |
490 | + SPEX(boardflags2_hi, SSB_SPROM8_BFL2HI, 0xFFFF, 0); | |
483 | 491 | SPEX(ant_available_a, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_A, |
484 | 492 | SSB_SPROM8_ANTAVAIL_A_SHIFT); |
485 | 493 | SPEX(ant_available_bg, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_BG, |
486 | 494 | |
... | ... | @@ -490,12 +498,55 @@ |
490 | 498 | SPEX(maxpwr_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_MAXP_A_MASK, 0); |
491 | 499 | SPEX(itssi_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_ITSSI_A, |
492 | 500 | SSB_SPROM8_ITSSI_A_SHIFT); |
501 | + SPEX(maxpwr_ah, SSB_SPROM8_MAXP_AHL, SSB_SPROM8_MAXP_AH_MASK, 0); | |
502 | + SPEX(maxpwr_al, SSB_SPROM8_MAXP_AHL, SSB_SPROM8_MAXP_AL_MASK, | |
503 | + SSB_SPROM8_MAXP_AL_SHIFT); | |
493 | 504 | SPEX(gpio0, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P0, 0); |
494 | 505 | SPEX(gpio1, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P1, |
495 | 506 | SSB_SPROM8_GPIOA_P1_SHIFT); |
496 | 507 | SPEX(gpio2, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P2, 0); |
497 | 508 | SPEX(gpio3, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P3, |
498 | 509 | SSB_SPROM8_GPIOB_P3_SHIFT); |
510 | + SPEX(tri2g, SSB_SPROM8_TRI25G, SSB_SPROM8_TRI2G, 0); | |
511 | + SPEX(tri5g, SSB_SPROM8_TRI25G, SSB_SPROM8_TRI5G, | |
512 | + SSB_SPROM8_TRI5G_SHIFT); | |
513 | + SPEX(tri5gl, SSB_SPROM8_TRI5GHL, SSB_SPROM8_TRI5GL, 0); | |
514 | + SPEX(tri5gh, SSB_SPROM8_TRI5GHL, SSB_SPROM8_TRI5GH, | |
515 | + SSB_SPROM8_TRI5GH_SHIFT); | |
516 | + SPEX(rxpo2g, SSB_SPROM8_RXPO, SSB_SPROM8_RXPO2G, 0); | |
517 | + SPEX(rxpo5g, SSB_SPROM8_RXPO, SSB_SPROM8_RXPO5G, | |
518 | + SSB_SPROM8_RXPO5G_SHIFT); | |
519 | + SPEX(rssismf2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISMF2G, 0); | |
520 | + SPEX(rssismc2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISMC2G, | |
521 | + SSB_SPROM8_RSSISMC2G_SHIFT); | |
522 | + SPEX(rssisav2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISAV2G, | |
523 | + SSB_SPROM8_RSSISAV2G_SHIFT); | |
524 | + SPEX(bxa2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_BXA2G, | |
525 | + SSB_SPROM8_BXA2G_SHIFT); | |
526 | + SPEX(rssismf5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISMF5G, 0); | |
527 | + SPEX(rssismc5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISMC5G, | |
528 | + SSB_SPROM8_RSSISMC5G_SHIFT); | |
529 | + SPEX(rssisav5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISAV5G, | |
530 | + SSB_SPROM8_RSSISAV5G_SHIFT); | |
531 | + SPEX(bxa5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_BXA5G, | |
532 | + SSB_SPROM8_BXA5G_SHIFT); | |
533 | + SPEX(pa0b0, SSB_SPROM8_PA0B0, 0xFFFF, 0); | |
534 | + SPEX(pa0b1, SSB_SPROM8_PA0B1, 0xFFFF, 0); | |
535 | + SPEX(pa0b2, SSB_SPROM8_PA0B2, 0xFFFF, 0); | |
536 | + SPEX(pa1b0, SSB_SPROM8_PA1B0, 0xFFFF, 0); | |
537 | + SPEX(pa1b1, SSB_SPROM8_PA1B1, 0xFFFF, 0); | |
538 | + SPEX(pa1b2, SSB_SPROM8_PA1B2, 0xFFFF, 0); | |
539 | + SPEX(pa1lob0, SSB_SPROM8_PA1LOB0, 0xFFFF, 0); | |
540 | + SPEX(pa1lob1, SSB_SPROM8_PA1LOB1, 0xFFFF, 0); | |
541 | + SPEX(pa1lob2, SSB_SPROM8_PA1LOB2, 0xFFFF, 0); | |
542 | + SPEX(pa1hib0, SSB_SPROM8_PA1HIB0, 0xFFFF, 0); | |
543 | + SPEX(pa1hib1, SSB_SPROM8_PA1HIB1, 0xFFFF, 0); | |
544 | + SPEX(pa1hib2, SSB_SPROM8_PA1HIB2, 0xFFFF, 0); | |
545 | + SPEX(cck2gpo, SSB_SPROM8_CCK2GPO, 0xFFFF, 0); | |
546 | + SPEX32(ofdm2gpo, SSB_SPROM8_OFDM2GPO, 0xFFFFFFFF, 0); | |
547 | + SPEX32(ofdm5glpo, SSB_SPROM8_OFDM5GLPO, 0xFFFFFFFF, 0); | |
548 | + SPEX32(ofdm5gpo, SSB_SPROM8_OFDM5GPO, 0xFFFFFFFF, 0); | |
549 | + SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0); | |
499 | 550 | |
500 | 551 | /* Extract the antenna gain values. */ |
501 | 552 | SPEX(antenna_gain.ghz24.a0, SSB_SPROM8_AGAIN01, |
include/linux/ssb/ssb.h
... | ... | @@ -27,24 +27,54 @@ |
27 | 27 | u8 et1mdcport; /* MDIO for enet1 */ |
28 | 28 | u8 board_rev; /* Board revision number from SPROM. */ |
29 | 29 | u8 country_code; /* Country Code */ |
30 | - u8 ant_available_a; /* A-PHY antenna available bits (up to 4) */ | |
31 | - u8 ant_available_bg; /* B/G-PHY antenna available bits (up to 4) */ | |
30 | + u8 ant_available_a; /* 2GHz antenna available bits (up to 4) */ | |
31 | + u8 ant_available_bg; /* 5GHz antenna available bits (up to 4) */ | |
32 | 32 | u16 pa0b0; |
33 | 33 | u16 pa0b1; |
34 | 34 | u16 pa0b2; |
35 | 35 | u16 pa1b0; |
36 | 36 | u16 pa1b1; |
37 | 37 | u16 pa1b2; |
38 | + u16 pa1lob0; | |
39 | + u16 pa1lob1; | |
40 | + u16 pa1lob2; | |
41 | + u16 pa1hib0; | |
42 | + u16 pa1hib1; | |
43 | + u16 pa1hib2; | |
38 | 44 | u8 gpio0; /* GPIO pin 0 */ |
39 | 45 | u8 gpio1; /* GPIO pin 1 */ |
40 | 46 | u8 gpio2; /* GPIO pin 2 */ |
41 | 47 | u8 gpio3; /* GPIO pin 3 */ |
42 | - u16 maxpwr_a; /* A-PHY Amplifier Max Power (in dBm Q5.2) */ | |
43 | - u16 maxpwr_bg; /* B/G-PHY Amplifier Max Power (in dBm Q5.2) */ | |
48 | + u16 maxpwr_bg; /* 2.4GHz Amplifier Max Power (in dBm Q5.2) */ | |
49 | + u16 maxpwr_al; /* 5.2GHz Amplifier Max Power (in dBm Q5.2) */ | |
50 | + u16 maxpwr_a; /* 5.3GHz Amplifier Max Power (in dBm Q5.2) */ | |
51 | + u16 maxpwr_ah; /* 5.8GHz Amplifier Max Power (in dBm Q5.2) */ | |
44 | 52 | u8 itssi_a; /* Idle TSSI Target for A-PHY */ |
45 | 53 | u8 itssi_bg; /* Idle TSSI Target for B/G-PHY */ |
46 | - u16 boardflags_lo; /* Boardflags (low 16 bits) */ | |
47 | - u16 boardflags_hi; /* Boardflags (high 16 bits) */ | |
54 | + u8 tri2g; /* 2.4GHz TX isolation */ | |
55 | + u8 tri5gl; /* 5.2GHz TX isolation */ | |
56 | + u8 tri5g; /* 5.3GHz TX isolation */ | |
57 | + u8 tri5gh; /* 5.8GHz TX isolation */ | |
58 | + u8 rxpo2g; /* 2GHz RX power offset */ | |
59 | + u8 rxpo5g; /* 5GHz RX power offset */ | |
60 | + u8 rssisav2g; /* 2GHz RSSI params */ | |
61 | + u8 rssismc2g; | |
62 | + u8 rssismf2g; | |
63 | + u8 bxa2g; /* 2GHz BX arch */ | |
64 | + u8 rssisav5g; /* 5GHz RSSI params */ | |
65 | + u8 rssismc5g; | |
66 | + u8 rssismf5g; | |
67 | + u8 bxa5g; /* 5GHz BX arch */ | |
68 | + u16 cck2gpo; /* CCK power offset */ | |
69 | + u32 ofdm2gpo; /* 2.4GHz OFDM power offset */ | |
70 | + u32 ofdm5glpo; /* 5.2GHz OFDM power offset */ | |
71 | + u32 ofdm5gpo; /* 5.3GHz OFDM power offset */ | |
72 | + u32 ofdm5ghpo; /* 5.8GHz OFDM power offset */ | |
73 | + u16 boardflags_lo; /* Board flags (bits 0-15) */ | |
74 | + u16 boardflags_hi; /* Board flags (bits 16-31) */ | |
75 | + u16 boardflags2_lo; /* Board flags (bits 32-47) */ | |
76 | + u16 boardflags2_hi; /* Board flags (bits 48-63) */ | |
77 | + /* TODO store board flags in a single u64 */ | |
48 | 78 | |
49 | 79 | /* Antenna gain values for up to 4 antennas |
50 | 80 | * on each band. Values in dBm/4 (Q5.2). Negative gain means the |
... | ... | @@ -58,7 +88,7 @@ |
58 | 88 | } ghz5; /* 5GHz band */ |
59 | 89 | } antenna_gain; |
60 | 90 | |
61 | - /* TODO - add any parameters needed from rev 2, 3, or 4 SPROMs */ | |
91 | + /* TODO - add any parameters needed from rev 2, 3, 4, 5 or 8 SPROMs */ | |
62 | 92 | }; |
63 | 93 | |
64 | 94 | /* Information about the PCB the circuitry is soldered on. */ |
include/linux/ssb/ssb_regs.h
... | ... | @@ -162,7 +162,7 @@ |
162 | 162 | |
163 | 163 | /* SPROM shadow area. If not otherwise noted, fields are |
164 | 164 | * two bytes wide. Note that the SPROM can _only_ be read |
165 | - * in two-byte quantinies. | |
165 | + * in two-byte quantities. | |
166 | 166 | */ |
167 | 167 | #define SSB_SPROMSIZE_WORDS 64 |
168 | 168 | #define SSB_SPROMSIZE_BYTES (SSB_SPROMSIZE_WORDS * sizeof(u16)) |
... | ... | @@ -327,8 +327,11 @@ |
327 | 327 | #define SSB_SPROM5_GPIOB_P3_SHIFT 8 |
328 | 328 | |
329 | 329 | /* SPROM Revision 8 */ |
330 | -#define SSB_SPROM8_BFLLO 0x1084 /* Boardflags (low 16 bits) */ | |
331 | -#define SSB_SPROM8_BFLHI 0x1086 /* Boardflags Hi */ | |
330 | +#define SSB_SPROM8_BOARDREV 0x1082 /* Board revision */ | |
331 | +#define SSB_SPROM8_BFLLO 0x1084 /* Board flags (bits 0-15) */ | |
332 | +#define SSB_SPROM8_BFLHI 0x1086 /* Board flags (bits 16-31) */ | |
333 | +#define SSB_SPROM8_BFL2LO 0x1088 /* Board flags (bits 32-47) */ | |
334 | +#define SSB_SPROM8_BFL2HI 0x108A /* Board flags (bits 48-63) */ | |
332 | 335 | #define SSB_SPROM8_IL0MAC 0x108C /* 6 byte MAC address */ |
333 | 336 | #define SSB_SPROM8_CCODE 0x1092 /* 2 byte country code */ |
334 | 337 | #define SSB_SPROM8_ANTAVAIL 0x109C /* Antenna available bitfields*/ |
335 | 338 | |
336 | 339 | |
... | ... | @@ -354,14 +357,63 @@ |
354 | 357 | #define SSB_SPROM8_GPIOB_P2 0x00FF /* Pin 2 */ |
355 | 358 | #define SSB_SPROM8_GPIOB_P3 0xFF00 /* Pin 3 */ |
356 | 359 | #define SSB_SPROM8_GPIOB_P3_SHIFT 8 |
357 | -#define SSB_SPROM8_MAXP_BG 0x10C0 /* Max Power BG in path 1 */ | |
358 | -#define SSB_SPROM8_MAXP_BG_MASK 0x00FF /* Mask for Max Power BG */ | |
360 | +#define SSB_SPROM8_RSSIPARM2G 0x10A4 /* RSSI params for 2GHz */ | |
361 | +#define SSB_SPROM8_RSSISMF2G 0x000F | |
362 | +#define SSB_SPROM8_RSSISMC2G 0x00F0 | |
363 | +#define SSB_SPROM8_RSSISMC2G_SHIFT 4 | |
364 | +#define SSB_SPROM8_RSSISAV2G 0x0700 | |
365 | +#define SSB_SPROM8_RSSISAV2G_SHIFT 8 | |
366 | +#define SSB_SPROM8_BXA2G 0x1800 | |
367 | +#define SSB_SPROM8_BXA2G_SHIFT 11 | |
368 | +#define SSB_SPROM8_RSSIPARM5G 0x10A6 /* RSSI params for 5GHz */ | |
369 | +#define SSB_SPROM8_RSSISMF5G 0x000F | |
370 | +#define SSB_SPROM8_RSSISMC5G 0x00F0 | |
371 | +#define SSB_SPROM8_RSSISMC5G_SHIFT 4 | |
372 | +#define SSB_SPROM8_RSSISAV5G 0x0700 | |
373 | +#define SSB_SPROM8_RSSISAV5G_SHIFT 8 | |
374 | +#define SSB_SPROM8_BXA5G 0x1800 | |
375 | +#define SSB_SPROM8_BXA5G_SHIFT 11 | |
376 | +#define SSB_SPROM8_TRI25G 0x10A8 /* TX isolation 2.4&5.3GHz */ | |
377 | +#define SSB_SPROM8_TRI2G 0x00FF /* TX isolation 2.4GHz */ | |
378 | +#define SSB_SPROM8_TRI5G 0xFF00 /* TX isolation 5.3GHz */ | |
379 | +#define SSB_SPROM8_TRI5G_SHIFT 8 | |
380 | +#define SSB_SPROM8_TRI5GHL 0x10AA /* TX isolation 5.2/5.8GHz */ | |
381 | +#define SSB_SPROM8_TRI5GL 0x00FF /* TX isolation 5.2GHz */ | |
382 | +#define SSB_SPROM8_TRI5GH 0xFF00 /* TX isolation 5.8GHz */ | |
383 | +#define SSB_SPROM8_TRI5GH_SHIFT 8 | |
384 | +#define SSB_SPROM8_RXPO 0x10AC /* RX power offsets */ | |
385 | +#define SSB_SPROM8_RXPO2G 0x00FF /* 2GHz RX power offset */ | |
386 | +#define SSB_SPROM8_RXPO5G 0xFF00 /* 5GHz RX power offset */ | |
387 | +#define SSB_SPROM8_RXPO5G_SHIFT 8 | |
388 | +#define SSB_SPROM8_MAXP_BG 0x10C0 /* Max Power 2GHz in path 1 */ | |
389 | +#define SSB_SPROM8_MAXP_BG_MASK 0x00FF /* Mask for Max Power 2GHz */ | |
359 | 390 | #define SSB_SPROM8_ITSSI_BG 0xFF00 /* Mask for path 1 itssi_bg */ |
360 | 391 | #define SSB_SPROM8_ITSSI_BG_SHIFT 8 |
361 | -#define SSB_SPROM8_MAXP_A 0x10C8 /* Max Power A in path 1 */ | |
362 | -#define SSB_SPROM8_MAXP_A_MASK 0x00FF /* Mask for Max Power A */ | |
392 | +#define SSB_SPROM8_PA0B0 0x10C2 /* 2GHz power amp settings */ | |
393 | +#define SSB_SPROM8_PA0B1 0x10C4 | |
394 | +#define SSB_SPROM8_PA0B2 0x10C6 | |
395 | +#define SSB_SPROM8_MAXP_A 0x10C8 /* Max Power 5.3GHz */ | |
396 | +#define SSB_SPROM8_MAXP_A_MASK 0x00FF /* Mask for Max Power 5.3GHz */ | |
363 | 397 | #define SSB_SPROM8_ITSSI_A 0xFF00 /* Mask for path 1 itssi_a */ |
364 | 398 | #define SSB_SPROM8_ITSSI_A_SHIFT 8 |
399 | +#define SSB_SPROM8_MAXP_AHL 0x10CA /* Max Power 5.2/5.8GHz */ | |
400 | +#define SSB_SPROM8_MAXP_AH_MASK 0x00FF /* Mask for Max Power 5.8GHz */ | |
401 | +#define SSB_SPROM8_MAXP_AL_MASK 0xFF00 /* Mask for Max Power 5.2GHz */ | |
402 | +#define SSB_SPROM8_MAXP_AL_SHIFT 8 | |
403 | +#define SSB_SPROM8_PA1B0 0x10CC /* 5.3GHz power amp settings */ | |
404 | +#define SSB_SPROM8_PA1B1 0x10CE | |
405 | +#define SSB_SPROM8_PA1B2 0x10D0 | |
406 | +#define SSB_SPROM8_PA1LOB0 0x10D2 /* 5.2GHz power amp settings */ | |
407 | +#define SSB_SPROM8_PA1LOB1 0x10D4 | |
408 | +#define SSB_SPROM8_PA1LOB2 0x10D6 | |
409 | +#define SSB_SPROM8_PA1HIB0 0x10D8 /* 5.8GHz power amp settings */ | |
410 | +#define SSB_SPROM8_PA1HIB1 0x10DA | |
411 | +#define SSB_SPROM8_PA1HIB2 0x10DC | |
412 | +#define SSB_SPROM8_CCK2GPO 0x1140 /* CCK power offset */ | |
413 | +#define SSB_SPROM8_OFDM2GPO 0x1142 /* 2.4GHz OFDM power offset */ | |
414 | +#define SSB_SPROM8_OFDM5GPO 0x1146 /* 5.3GHz OFDM power offset */ | |
415 | +#define SSB_SPROM8_OFDM5GLPO 0x114A /* 5.2GHz OFDM power offset */ | |
416 | +#define SSB_SPROM8_OFDM5GHPO 0x114E /* 5.8GHz OFDM power offset */ | |
365 | 417 | |
366 | 418 | /* Values for SSB_SPROM1_BINF_CCODE */ |
367 | 419 | enum { |