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:
Rafał Miłecki 2013-05-13 22:07:51 +02:00 committed by John W. Linville
parent 224c9c2366
commit 5179ed7c1b
1 changed files with 15 additions and 15 deletions

View File

@ -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);