bcma: prepare for supporting more SPROM sizes
authorRafał Miłecki <zajec5@gmail.com>
Mon, 13 May 2013 20:07:52 +0000 (22:07 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 May 2013 19:08:42 +0000 (15:08 -0400)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/bcma/sprom.c

index 5386cddba43ef0b90dc109b5267036757aa6b5b3..c96f71c183cdf0c57822383d3c54c120dd26e936 100644 (file)
@@ -502,7 +502,6 @@ static bool bcma_sprom_onchip_available(struct bcma_bus *bus)
        case BCMA_CHIP_ID_BCM4331:
                present = chip_status & BCMA_CC_CHIPST_4331_OTP_PRESENT;
                break;
-
        case BCMA_CHIP_ID_BCM43224:
        case BCMA_CHIP_ID_BCM43225:
                /* for these chips OTP is always available */
@@ -550,7 +549,8 @@ int bcma_sprom_get(struct bcma_bus *bus)
 {
        u16 offset = BCMA_CC_SPROM;
        u16 *sprom;
-       int err = 0;
+       size_t sprom_sizes[] = { SSB_SPROMSIZE_WORDS_R4, };
+       int i, err = 0;
 
        if (!bus->drv_cc.core)
                return -EOPNOTSUPP;
@@ -579,32 +579,37 @@ int bcma_sprom_get(struct bcma_bus *bus)
                }
        }
 
-       sprom = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
-                       GFP_KERNEL);
-       if (!sprom)
-               return -ENOMEM;
-
        if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4331 ||
            bus->chipinfo.id == BCMA_CHIP_ID_BCM43431)
                bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false);
 
        bcma_debug(bus, "SPROM offset 0x%x\n", offset);
-       bcma_sprom_read(bus, offset, sprom, SSB_SPROMSIZE_WORDS_R4);
+       for (i = 0; i < ARRAY_SIZE(sprom_sizes); i++) {
+               size_t words = sprom_sizes[i];
+
+               sprom = kcalloc(words, sizeof(u16), GFP_KERNEL);
+               if (!sprom)
+                       return -ENOMEM;
+
+               bcma_sprom_read(bus, offset, sprom, words);
+               err = bcma_sprom_valid(sprom, words);
+               if (!err)
+                       break;
+
+               kfree(sprom);
+       }
 
        if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4331 ||
            bus->chipinfo.id == BCMA_CHIP_ID_BCM43431)
                bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true);
 
-       err = bcma_sprom_valid(sprom, SSB_SPROMSIZE_WORDS_R4);
        if (err) {
-               bcma_warn(bus, "invalid sprom read from the PCIe card, try to use fallback sprom\n");
+               bcma_warn(bus, "Invalid SPROM read from the PCIe card, trying to use fallback SPROM\n");
                err = bcma_fill_sprom_with_fallback(bus, &bus->sprom);
-               goto out;
+       } else {
+               bcma_sprom_extract_r8(bus, sprom);
+               kfree(sprom);
        }
 
-       bcma_sprom_extract_r8(bus, sprom);
-
-out:
-       kfree(sprom);
        return err;
 }