bcma: don't hardcode SPROM length
Pass it as an argument to all functions. This is requires as newer SPROM revisions have different lengths. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
224c9c2366
commit
5179ed7c1b
|
@ -72,12 +72,12 @@ fail:
|
||||||
* R/W ops.
|
* R/W ops.
|
||||||
**************************************************/
|
**************************************************/
|
||||||
|
|
||||||
static void bcma_sprom_read(struct bcma_bus *bus, u16 offset, u16 *sprom)
|
static void bcma_sprom_read(struct bcma_bus *bus, u16 offset, u16 *sprom,
|
||||||
|
size_t words)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < SSB_SPROMSIZE_WORDS_R4; i++)
|
for (i = 0; i < words; i++)
|
||||||
sprom[i] = bcma_read16(bus->drv_cc.core,
|
sprom[i] = bcma_read16(bus->drv_cc.core, offset + (i * 2));
|
||||||
offset + (i * 2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************
|
/**************************************************
|
||||||
|
@ -124,29 +124,29 @@ static inline u8 bcma_crc8(u8 crc, u8 data)
|
||||||
return t[crc ^ data];
|
return t[crc ^ data];
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 bcma_sprom_crc(const u16 *sprom)
|
static u8 bcma_sprom_crc(const u16 *sprom, size_t words)
|
||||||
{
|
{
|
||||||
int word;
|
int word;
|
||||||
u8 crc = 0xFF;
|
u8 crc = 0xFF;
|
||||||
|
|
||||||
for (word = 0; word < SSB_SPROMSIZE_WORDS_R4 - 1; word++) {
|
for (word = 0; word < words - 1; word++) {
|
||||||
crc = bcma_crc8(crc, sprom[word] & 0x00FF);
|
crc = bcma_crc8(crc, sprom[word] & 0x00FF);
|
||||||
crc = bcma_crc8(crc, (sprom[word] & 0xFF00) >> 8);
|
crc = bcma_crc8(crc, (sprom[word] & 0xFF00) >> 8);
|
||||||
}
|
}
|
||||||
crc = bcma_crc8(crc, sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & 0x00FF);
|
crc = bcma_crc8(crc, sprom[words - 1] & 0x00FF);
|
||||||
crc ^= 0xFF;
|
crc ^= 0xFF;
|
||||||
|
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bcma_sprom_check_crc(const u16 *sprom)
|
static int bcma_sprom_check_crc(const u16 *sprom, size_t words)
|
||||||
{
|
{
|
||||||
u8 crc;
|
u8 crc;
|
||||||
u8 expected_crc;
|
u8 expected_crc;
|
||||||
u16 tmp;
|
u16 tmp;
|
||||||
|
|
||||||
crc = bcma_sprom_crc(sprom);
|
crc = bcma_sprom_crc(sprom, words);
|
||||||
tmp = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & SSB_SPROM_REVISION_CRC;
|
tmp = sprom[words - 1] & SSB_SPROM_REVISION_CRC;
|
||||||
expected_crc = tmp >> SSB_SPROM_REVISION_CRC_SHIFT;
|
expected_crc = tmp >> SSB_SPROM_REVISION_CRC_SHIFT;
|
||||||
if (crc != expected_crc)
|
if (crc != expected_crc)
|
||||||
return -EPROTO;
|
return -EPROTO;
|
||||||
|
@ -154,16 +154,16 @@ static int bcma_sprom_check_crc(const u16 *sprom)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bcma_sprom_valid(const u16 *sprom)
|
static int bcma_sprom_valid(const u16 *sprom, size_t words)
|
||||||
{
|
{
|
||||||
u16 revision;
|
u16 revision;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = bcma_sprom_check_crc(sprom);
|
err = bcma_sprom_check_crc(sprom, words);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & SSB_SPROM_REVISION_REV;
|
revision = sprom[words - 1] & SSB_SPROM_REVISION_REV;
|
||||||
if (revision != 8 && revision != 9) {
|
if (revision != 8 && revision != 9) {
|
||||||
pr_err("Unsupported SPROM revision: %d\n", revision);
|
pr_err("Unsupported SPROM revision: %d\n", revision);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
@ -589,13 +589,13 @@ int bcma_sprom_get(struct bcma_bus *bus)
|
||||||
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);
|
bcma_sprom_read(bus, offset, sprom, SSB_SPROMSIZE_WORDS_R4);
|
||||||
|
|
||||||
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);
|
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, try to use fallback sprom\n");
|
||||||
err = bcma_fill_sprom_with_fallback(bus, &bus->sprom);
|
err = bcma_fill_sprom_with_fallback(bus, &bus->sprom);
|
||||||
|
|
Loading…
Reference in New Issue