mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
ssb: do not read SPROM if it does not exist
Attempting to read registers that don't exist on the SSB bus can cause hangs on some boxes. At least some b43 devices are 'in the wild' that don't have SPROMs at all. When the SSB bus support loads, it attempts to read these (non-existant) SPROMs and causes hard hangs on the box -- no console output, etc. This patch adds some intelligence to determine whether or not the SPROM is present before attempting to read it. This avoids those hard hangs on those devices with no SPROM attached to their SSB bus. The SSB-attached devices (e.g. b43, et al.) won't work, but at least the box will survive to test further patches. :-) Signed-off-by: John W. Linville <[email protected]> Signed-off-by: Rafał Miłecki <[email protected]> Cc: Larry Finger <[email protected]> Cc: Michael Buesch <[email protected]>
This commit is contained in:
parent
672724403b
commit
d53cdbb94a
5 changed files with 39 additions and 0 deletions
|
|
@ -233,6 +233,8 @@ void ssb_chipcommon_init(struct ssb_chipcommon *cc)
|
|||
{
|
||||
if (!cc->dev)
|
||||
return; /* We don't have a ChipCommon */
|
||||
if (cc->dev->id.revision >= 11)
|
||||
cc->status = chipco_read32(cc, SSB_CHIPCO_CHIPSTAT);
|
||||
ssb_pmu_init(cc);
|
||||
chipco_powercontrol_init(cc);
|
||||
ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST);
|
||||
|
|
|
|||
|
|
@ -620,6 +620,11 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,
|
|||
int err = -ENOMEM;
|
||||
u16 *buf;
|
||||
|
||||
if (!ssb_is_sprom_available(bus)) {
|
||||
ssb_printk(KERN_ERR PFX "No SPROM available!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
|
||||
if (!buf)
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -175,3 +175,17 @@ const struct ssb_sprom *ssb_get_fallback_sprom(void)
|
|||
{
|
||||
return fallback_sprom;
|
||||
}
|
||||
|
||||
/* http://bcm-v4.sipsolutions.net/802.11/IsSpromAvailable */
|
||||
bool ssb_is_sprom_available(struct ssb_bus *bus)
|
||||
{
|
||||
/* status register only exists on chipcomon rev >= 11 and we need check
|
||||
for >= 31 only */
|
||||
/* this routine differs from specs as we do not access SPROM directly
|
||||
on PCMCIA */
|
||||
if (bus->bustype == SSB_BUSTYPE_PCI &&
|
||||
bus->chipco.dev->id.revision >= 31)
|
||||
return bus->chipco.capabilities & SSB_CHIPCO_CAP_SPROM;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue