diff options
Diffstat (limited to 'drivers/ssb')
-rw-r--r-- | drivers/ssb/b43_pci_bridge.c | 1 | ||||
-rw-r--r-- | drivers/ssb/pci.c | 74 |
2 files changed, 63 insertions, 12 deletions
diff --git a/drivers/ssb/b43_pci_bridge.c b/drivers/ssb/b43_pci_bridge.c index 6433a7ed39f8..27a677584a4c 100644 --- a/drivers/ssb/b43_pci_bridge.c +++ b/drivers/ssb/b43_pci_bridge.c | |||
@@ -21,6 +21,7 @@ static const struct pci_device_id b43_pci_bridge_tbl[] = { | |||
21 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4307) }, | 21 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4307) }, |
22 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4311) }, | 22 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4311) }, |
23 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4312) }, | 23 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4312) }, |
24 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4315) }, | ||
24 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4318) }, | 25 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4318) }, |
25 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4319) }, | 26 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4319) }, |
26 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4320) }, | 27 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4320) }, |
diff --git a/drivers/ssb/pci.c b/drivers/ssb/pci.c index d5cde051806b..c958ac16423c 100644 --- a/drivers/ssb/pci.c +++ b/drivers/ssb/pci.c | |||
@@ -467,6 +467,51 @@ static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in) | |||
467 | /* TODO - get remaining rev 4 stuff needed */ | 467 | /* TODO - get remaining rev 4 stuff needed */ |
468 | } | 468 | } |
469 | 469 | ||
470 | static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in) | ||
471 | { | ||
472 | int i; | ||
473 | u16 v; | ||
474 | |||
475 | /* extract the MAC address */ | ||
476 | for (i = 0; i < 3; i++) { | ||
477 | v = in[SPOFF(SSB_SPROM1_IL0MAC) + i]; | ||
478 | *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); | ||
479 | } | ||
480 | SPEX(country_code, SSB_SPROM8_CCODE, 0xFFFF, 0); | ||
481 | SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0); | ||
482 | SPEX(boardflags_hi, SSB_SPROM8_BFLHI, 0xFFFF, 0); | ||
483 | SPEX(ant_available_a, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_A, | ||
484 | SSB_SPROM8_ANTAVAIL_A_SHIFT); | ||
485 | SPEX(ant_available_bg, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_BG, | ||
486 | SSB_SPROM8_ANTAVAIL_BG_SHIFT); | ||
487 | SPEX(maxpwr_bg, SSB_SPROM8_MAXP_BG, SSB_SPROM8_MAXP_BG_MASK, 0); | ||
488 | SPEX(itssi_bg, SSB_SPROM8_MAXP_BG, SSB_SPROM8_ITSSI_BG, | ||
489 | SSB_SPROM8_ITSSI_BG_SHIFT); | ||
490 | SPEX(maxpwr_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_MAXP_A_MASK, 0); | ||
491 | SPEX(itssi_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_ITSSI_A, | ||
492 | SSB_SPROM8_ITSSI_A_SHIFT); | ||
493 | SPEX(gpio0, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P0, 0); | ||
494 | SPEX(gpio1, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P1, | ||
495 | SSB_SPROM8_GPIOA_P1_SHIFT); | ||
496 | SPEX(gpio2, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P2, 0); | ||
497 | SPEX(gpio3, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P3, | ||
498 | SSB_SPROM8_GPIOB_P3_SHIFT); | ||
499 | |||
500 | /* Extract the antenna gain values. */ | ||
501 | SPEX(antenna_gain.ghz24.a0, SSB_SPROM8_AGAIN01, | ||
502 | SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT); | ||
503 | SPEX(antenna_gain.ghz24.a1, SSB_SPROM8_AGAIN01, | ||
504 | SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT); | ||
505 | SPEX(antenna_gain.ghz24.a2, SSB_SPROM8_AGAIN23, | ||
506 | SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); | ||
507 | SPEX(antenna_gain.ghz24.a3, SSB_SPROM8_AGAIN23, | ||
508 | SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); | ||
509 | memcpy(&out->antenna_gain.ghz5, &out->antenna_gain.ghz24, | ||
510 | sizeof(out->antenna_gain.ghz5)); | ||
511 | |||
512 | /* TODO - get remaining rev 8 stuff needed */ | ||
513 | } | ||
514 | |||
470 | static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out, | 515 | static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out, |
471 | const u16 *in, u16 size) | 516 | const u16 *in, u16 size) |
472 | { | 517 | { |
@@ -487,15 +532,25 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out, | |||
487 | out->revision = 4; | 532 | out->revision = 4; |
488 | sprom_extract_r45(out, in); | 533 | sprom_extract_r45(out, in); |
489 | } else { | 534 | } else { |
490 | if (out->revision == 0) | 535 | switch (out->revision) { |
491 | goto unsupported; | 536 | case 1: |
492 | if (out->revision >= 1 && out->revision <= 3) { | 537 | case 2: |
538 | case 3: | ||
493 | sprom_extract_r123(out, in); | 539 | sprom_extract_r123(out, in); |
494 | } | 540 | break; |
495 | if (out->revision == 4 || out->revision == 5) | 541 | case 4: |
542 | case 5: | ||
496 | sprom_extract_r45(out, in); | 543 | sprom_extract_r45(out, in); |
497 | if (out->revision > 5) | 544 | break; |
498 | goto unsupported; | 545 | case 8: |
546 | sprom_extract_r8(out, in); | ||
547 | break; | ||
548 | default: | ||
549 | ssb_printk(KERN_WARNING PFX "Unsupported SPROM" | ||
550 | " revision %d detected. Will extract" | ||
551 | " v1\n", out->revision); | ||
552 | sprom_extract_r123(out, in); | ||
553 | } | ||
499 | } | 554 | } |
500 | 555 | ||
501 | if (out->boardflags_lo == 0xFFFF) | 556 | if (out->boardflags_lo == 0xFFFF) |
@@ -504,11 +559,6 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out, | |||
504 | out->boardflags_hi = 0; /* per specs */ | 559 | out->boardflags_hi = 0; /* per specs */ |
505 | 560 | ||
506 | return 0; | 561 | return 0; |
507 | unsupported: | ||
508 | ssb_printk(KERN_WARNING PFX "Unsupported SPROM revision %d " | ||
509 | "detected. Will extract v1\n", out->revision); | ||
510 | sprom_extract_r123(out, in); | ||
511 | return 0; | ||
512 | } | 562 | } |
513 | 563 | ||
514 | static int ssb_pci_sprom_get(struct ssb_bus *bus, | 564 | static int ssb_pci_sprom_get(struct ssb_bus *bus, |