Search Linux Wireless

Re: [RFC] use alternate SPROM offset for 43224

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Feb 14, 2012 at 06:29:59PM +0100, Rafał Miłecki wrote:
> W dniu 14 lutego 2012 17:22 użytkownik Saul St. John
> <saul.stjohn@xxxxxxxxx> napisał:
> > On Tue, Feb 14, 2012 at 7:34 AM, Rafał Miłecki <zajec5@xxxxxxxxx> wrote:
> >> W dniu 14 lutego 2012 05:01 użytkownik Saul St. John
> >> <saul.stjohn@xxxxxxxxx> napisał:
> >>> I don't know if this is correct in the general sense, but the wireless on my
> >>> mid-2010 MacBook Pro doesn't work without it.
> >>>
> >>> Signed-off-by: Saul St. John <saul.stjohn@xxxxxxxxx>
> >>> ---
> >>>  drivers/bcma/sprom.c |    4 ++--
> >>>  1 files changed, 2 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c
> >>> index 6f230fb..06c87b5 100644
> >>> --- a/drivers/bcma/sprom.c
> >>> +++ b/drivers/bcma/sprom.c
> >>> @@ -228,8 +228,8 @@ int bcma_sprom_get(struct bcma_bus *bus)
> >>>        /* 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;
> >>> +       offset = (bus->chipinfo.id == 0x4331 || bus->chipinfo.id == 43224) ?
> >>> +                       BCMA_CC_SPROM : BCMA_CC_SPROM_PCIE6;
> >>>        bcma_sprom_read(bus, offset, sprom);
> >>>
> >>>        if (bus->chipinfo.id == 0x4331)
> >>
> >> I'm quite sure it'll break my BCM43224. It's not chip-specific,
> >> probably some status bit specific.
> >>
> >> --
> >> Rafał
> >
> > My BCM43324 was broken by bmca up until "[PATCH] bcma: don't fail for
> > bad SPROM CRC." Even with that patch, I still get "bmca: Failed to get
> > SPROM: -71" in the dmesg log. Is that error harmless?
> 
> It's harmless for brcmsmac, which doesn't use SPROM struct of bcma bus
> driver. This bug should be fixed and brcmsmac should be improved in
> many contexts: using SPROM, standard bcma module functions, dropping
> other cores initializing. For now you can live with this.
> 
My worry is that, were the brcmsmac driver to be improved in the ways you
suggest, the BCM43224 in my MBP would start failing again.
> 
> > The CRC check appears to pass without issue when using the 0x800
> > offset on my device.
> 
> The quick fix would be probably to implement in bcma two tries of
> reading SPROM. One for 0x800 second for 0x830 (base address). The real
> fix is to grab the real condition from specs/brcmsmac and implement it
> in bcma.
> 
Real fix: any leads on where the real condition can be found? I looked through
the brcmsmac driver, but it wasn't obvious to me.

Quick fix: something like this?

Signed-off-by: Saul St. John <saul.stjohn@xxxxxxxxx>
---
 drivers/bcma/sprom.c |   24 ++++++++++++++----------
 1 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c
index 6f230fb..e99807e 100644
--- a/drivers/bcma/sprom.c
+++ b/drivers/bcma/sprom.c
@@ -207,7 +207,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 offset = 0;
 	u16 *sprom;
 	int err = 0;
 
@@ -222,20 +222,24 @@ int bcma_sprom_get(struct bcma_bus *bus)
 	if (!sprom)
 		return -ENOMEM;
 
-	if (bus->chipinfo.id == 0x4331)
-		bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false);
-
 	/* 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);
+	do {
+		if (bus->chipinfo.id == 0x4331)
+			bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, 
+							     false);
+
+		offset = (offset == 0) ? BCMA_CC_SPROM : BCMA_CC_SPROM_PCIE6;
+		bcma_sprom_read(bus, offset, sprom);
+
+		if (bus->chipinfo.id == 0x4331)
+			bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, 
+							     true);
 
-	if (bus->chipinfo.id == 0x4331)
-		bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true);
+		err = bcma_sprom_valid(sprom);
+	} while (err && (offset != BCMA_CC_SPROM_PCIE6));
 
-	err = bcma_sprom_valid(sprom);
 	if (err)
 		goto out;
 
-- 
1.7.9

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux