diff options
Diffstat (limited to 'drivers/ssb/pci.c')
-rw-r--r-- | drivers/ssb/pci.c | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/drivers/ssb/pci.c b/drivers/ssb/pci.c index 6e88d2b603b..f52966305e0 100644 --- a/drivers/ssb/pci.c +++ b/drivers/ssb/pci.c | |||
@@ -573,37 +573,34 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out, | |||
573 | ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision); | 573 | ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision); |
574 | memset(out->et0mac, 0xFF, 6); /* preset et0 and et1 mac */ | 574 | memset(out->et0mac, 0xFF, 6); /* preset et0 and et1 mac */ |
575 | memset(out->et1mac, 0xFF, 6); | 575 | memset(out->et1mac, 0xFF, 6); |
576 | |||
576 | if ((bus->chip_id & 0xFF00) == 0x4400) { | 577 | if ((bus->chip_id & 0xFF00) == 0x4400) { |
577 | /* Workaround: The BCM44XX chip has a stupid revision | 578 | /* Workaround: The BCM44XX chip has a stupid revision |
578 | * number stored in the SPROM. | 579 | * number stored in the SPROM. |
579 | * Always extract r1. */ | 580 | * Always extract r1. */ |
580 | out->revision = 1; | 581 | out->revision = 1; |
582 | ssb_dprintk(KERN_DEBUG PFX "SPROM treated as revision %d\n", out->revision); | ||
583 | } | ||
584 | |||
585 | switch (out->revision) { | ||
586 | case 1: | ||
587 | case 2: | ||
588 | case 3: | ||
581 | sprom_extract_r123(out, in); | 589 | sprom_extract_r123(out, in); |
582 | } else if (bus->chip_id == 0x4321) { | 590 | break; |
583 | /* the BCM4328 has a chipid == 0x4321 and a rev 4 SPROM */ | 591 | case 4: |
584 | out->revision = 4; | 592 | case 5: |
585 | sprom_extract_r45(out, in); | 593 | sprom_extract_r45(out, in); |
586 | } else { | 594 | break; |
587 | switch (out->revision) { | 595 | case 8: |
588 | case 1: | 596 | sprom_extract_r8(out, in); |
589 | case 2: | 597 | break; |
590 | case 3: | 598 | default: |
591 | sprom_extract_r123(out, in); | 599 | ssb_printk(KERN_WARNING PFX "Unsupported SPROM" |
592 | break; | 600 | " revision %d detected. Will extract" |
593 | case 4: | 601 | " v1\n", out->revision); |
594 | case 5: | 602 | out->revision = 1; |
595 | sprom_extract_r45(out, in); | 603 | sprom_extract_r123(out, in); |
596 | break; | ||
597 | case 8: | ||
598 | sprom_extract_r8(out, in); | ||
599 | break; | ||
600 | default: | ||
601 | ssb_printk(KERN_WARNING PFX "Unsupported SPROM" | ||
602 | " revision %d detected. Will extract" | ||
603 | " v1\n", out->revision); | ||
604 | out->revision = 1; | ||
605 | sprom_extract_r123(out, in); | ||
606 | } | ||
607 | } | 604 | } |
608 | 605 | ||
609 | if (out->boardflags_lo == 0xFFFF) | 606 | if (out->boardflags_lo == 0xFFFF) |
@@ -618,7 +615,7 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus, | |||
618 | struct ssb_sprom *sprom) | 615 | struct ssb_sprom *sprom) |
619 | { | 616 | { |
620 | const struct ssb_sprom *fallback; | 617 | const struct ssb_sprom *fallback; |
621 | int err = -ENOMEM; | 618 | int err; |
622 | u16 *buf; | 619 | u16 *buf; |
623 | 620 | ||
624 | if (!ssb_is_sprom_available(bus)) { | 621 | if (!ssb_is_sprom_available(bus)) { |
@@ -645,7 +642,7 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus, | |||
645 | 642 | ||
646 | buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); | 643 | buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); |
647 | if (!buf) | 644 | if (!buf) |
648 | goto out; | 645 | return -ENOMEM; |
649 | bus->sprom_size = SSB_SPROMSIZE_WORDS_R123; | 646 | bus->sprom_size = SSB_SPROMSIZE_WORDS_R123; |
650 | sprom_do_read(bus, buf); | 647 | sprom_do_read(bus, buf); |
651 | err = sprom_check_crc(buf, bus->sprom_size); | 648 | err = sprom_check_crc(buf, bus->sprom_size); |
@@ -655,7 +652,7 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus, | |||
655 | buf = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16), | 652 | buf = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16), |
656 | GFP_KERNEL); | 653 | GFP_KERNEL); |
657 | if (!buf) | 654 | if (!buf) |
658 | goto out; | 655 | return -ENOMEM; |
659 | bus->sprom_size = SSB_SPROMSIZE_WORDS_R4; | 656 | bus->sprom_size = SSB_SPROMSIZE_WORDS_R4; |
660 | sprom_do_read(bus, buf); | 657 | sprom_do_read(bus, buf); |
661 | err = sprom_check_crc(buf, bus->sprom_size); | 658 | err = sprom_check_crc(buf, bus->sprom_size); |
@@ -677,7 +674,6 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus, | |||
677 | 674 | ||
678 | out_free: | 675 | out_free: |
679 | kfree(buf); | 676 | kfree(buf); |
680 | out: | ||
681 | return err; | 677 | return err; |
682 | } | 678 | } |
683 | 679 | ||