bcma: prepare for supporting more SPROM sizes
Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
5179ed7c1b
commit
92eb164258
1 changed files with 20 additions and 15 deletions
|
@ -502,7 +502,6 @@ static bool bcma_sprom_onchip_available(struct bcma_bus *bus)
|
||||||
case BCMA_CHIP_ID_BCM4331:
|
case BCMA_CHIP_ID_BCM4331:
|
||||||
present = chip_status & BCMA_CC_CHIPST_4331_OTP_PRESENT;
|
present = chip_status & BCMA_CC_CHIPST_4331_OTP_PRESENT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BCMA_CHIP_ID_BCM43224:
|
case BCMA_CHIP_ID_BCM43224:
|
||||||
case BCMA_CHIP_ID_BCM43225:
|
case BCMA_CHIP_ID_BCM43225:
|
||||||
/* for these chips OTP is always available */
|
/* 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 offset = BCMA_CC_SPROM;
|
||||||
u16 *sprom;
|
u16 *sprom;
|
||||||
int err = 0;
|
size_t sprom_sizes[] = { SSB_SPROMSIZE_WORDS_R4, };
|
||||||
|
int i, err = 0;
|
||||||
|
|
||||||
if (!bus->drv_cc.core)
|
if (!bus->drv_cc.core)
|
||||||
return -EOPNOTSUPP;
|
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 ||
|
if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4331 ||
|
||||||
bus->chipinfo.id == BCMA_CHIP_ID_BCM43431)
|
bus->chipinfo.id == BCMA_CHIP_ID_BCM43431)
|
||||||
bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false);
|
bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false);
|
||||||
|
|
||||||
bcma_debug(bus, "SPROM offset 0x%x\n", offset);
|
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 ||
|
if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4331 ||
|
||||||
bus->chipinfo.id == BCMA_CHIP_ID_BCM43431)
|
bus->chipinfo.id == BCMA_CHIP_ID_BCM43431)
|
||||||
bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true);
|
bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true);
|
||||||
|
|
||||||
err = bcma_sprom_valid(sprom, SSB_SPROMSIZE_WORDS_R4);
|
|
||||||
if (err) {
|
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);
|
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;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue