aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ssb/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ssb/pci.c')
-rw-r--r--drivers/ssb/pci.c52
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
678out_free: 675out_free:
679 kfree(buf); 676 kfree(buf);
680out:
681 return err; 677 return err;
682} 678}
683 679