bcma: handle alternative SPROM location
authorRafał Miłecki <zajec5@gmail.com>
Sun, 17 Jul 2011 09:00:59 +0000 (11:00 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 19 Jul 2011 20:49:53 +0000 (16:49 -0400)
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>
drivers/bcma/sprom.c
include/linux/bcma/bcma_driver_chipcommon.h

index 52917e5bb892240d5dd56ef8973e222a42154608..8b5b7856abe3314ceeb9526811267b9f7e3a2576 100644 (file)
  * 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)
index 9c5b69fc985a1fbfb3e6d44e3afe9209c5f2aaef..68c3d941a215b5def8cea95ff4a2367286600abb 100644 (file)
 #define BCMA_CC_REGCTL_DATA            0x065C
 #define BCMA_CC_PLLCTL_ADDR            0x0660
 #define BCMA_CC_PLLCTL_DATA            0x0664
-#define BCMA_CC_SPROM                  0x0830 /* SPROM beginning */
+#define BCMA_CC_SPROM                  0x0800 /* SPROM beginning */
+#define BCMA_CC_SPROM_PCIE6            0x0830 /* SPROM beginning on PCIe rev >= 6 */
 
 /* Data for the PMU, if available.
  * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU)