summaryrefslogtreecommitdiff
path: root/drivers/bcma
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2011-07-17 09:00:59 (GMT)
committerJohn W. Linville <linville@tuxdriver.com>2011-07-19 20:49:53 (GMT)
commiteb1577b7c4b2cdd0e18b0d5d8e940e36329215e5 (patch)
tree0a6134bf849eb48c06692573504ad5f511d6c9cd /drivers/bcma
parentb473bc176702cb22529632b5c4315bda27e0d979 (diff)
downloadlinux-eb1577b7c4b2cdd0e18b0d5d8e940e36329215e5.tar.xz
bcma: handle alternative SPROM location
Some cards do not use additional 0x30 offset for SPROM location. We do not know the real condition for it yet, make it BCM4331 specific for now. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/bcma')
-rw-r--r--drivers/bcma/sprom.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c
index 52917e5..8b5b785 100644
--- a/drivers/bcma/sprom.c
+++ b/drivers/bcma/sprom.c
@@ -20,12 +20,12 @@
* R/W ops.
**************************************************/
-static void bcma_sprom_read(struct bcma_bus *bus, u16 *sprom)
+static void bcma_sprom_read(struct bcma_bus *bus, u16 offset, u16 *sprom)
{
int i;
for (i = 0; i < SSB_SPROMSIZE_WORDS_R4; i++)
sprom[i] = bcma_read16(bus->drv_cc.core,
- BCMA_CC_SPROM + (i * 2));
+ offset + (i * 2));
}
/**************************************************
@@ -137,6 +137,7 @@ static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom)
int bcma_sprom_get(struct bcma_bus *bus)
{
+ u16 offset;
u16 *sprom;
int err = 0;
@@ -151,7 +152,12 @@ int bcma_sprom_get(struct bcma_bus *bus)
if (!sprom)
return -ENOMEM;
- bcma_sprom_read(bus, sprom);
+ /* Most cards have SPROM moved by additional offset 0x30 (48 dwords).
+ * According to brcm80211 this applies to cards with PCIe rev >= 6
+ * TODO: understand this condition and use it */
+ offset = (bus->chipinfo.id == 0x4331) ? BCMA_CC_SPROM :
+ BCMA_CC_SPROM_PCIE6;
+ bcma_sprom_read(bus, offset, sprom);
err = bcma_sprom_valid(sprom);
if (err)