From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
"John W. Linville" <linville@tuxdriver.com>,
"RafaÅ MiÅecki" <zajec5@gmail.com>,
"Larry Finger" <Larry.Finger@lwfinger.net>,
"Michael Buesch" <mb@bu3sch.de>,
"Ben Hutchings" <ben@decadent.org.uk>
Subject: [33/36] ssb: do not read SPROM if it does not exist
Date: Fri, 06 Aug 2010 12:20:14 -0700 [thread overview]
Message-ID: <20100806192117.424351093@clark.site> (raw)
In-Reply-To: <20100806192649.GA1614@kroah.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 5215 bytes --]
2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: John W. Linville <linville@tuxdriver.com>
commit d53cdbb94a52a920d5420ed64d986c3523a56743 upstream.
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 <linville@tuxdriver.com>
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Cc: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Michael Buesch <mb@bu3sch.de>
Cc: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/ssb/driver_chipcommon.c | 2 ++
drivers/ssb/pci.c | 5 +++++
drivers/ssb/sprom.c | 14 ++++++++++++++
include/linux/ssb/ssb.h | 3 +++
include/linux/ssb/ssb_driver_chipcommon.h | 15 +++++++++++++++
5 files changed, 39 insertions(+)
--- a/drivers/ssb/driver_chipcommon.c
+++ b/drivers/ssb/driver_chipcommon.c
@@ -233,6 +233,8 @@ void ssb_chipcommon_init(struct ssb_chip
{
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);
--- a/drivers/ssb/pci.c
+++ b/drivers/ssb/pci.c
@@ -621,6 +621,11 @@ static int ssb_pci_sprom_get(struct ssb_
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;
--- a/drivers/ssb/sprom.c
+++ b/drivers/ssb/sprom.c
@@ -176,3 +176,17 @@ const struct ssb_sprom *ssb_get_fallback
{
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;
+}
--- a/include/linux/ssb/ssb.h
+++ b/include/linux/ssb/ssb.h
@@ -394,6 +394,9 @@ extern int ssb_bus_sdiobus_register(stru
extern void ssb_bus_unregister(struct ssb_bus *bus);
+/* Does the device have an SPROM? */
+extern bool ssb_is_sprom_available(struct ssb_bus *bus);
+
/* Set a fallback SPROM.
* See kdoc at the function definition for complete documentation. */
extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom);
--- a/include/linux/ssb/ssb_driver_chipcommon.h
+++ b/include/linux/ssb/ssb_driver_chipcommon.h
@@ -53,6 +53,7 @@
#define SSB_CHIPCO_CAP_64BIT 0x08000000 /* 64-bit Backplane */
#define SSB_CHIPCO_CAP_PMU 0x10000000 /* PMU available (rev >= 20) */
#define SSB_CHIPCO_CAP_ECI 0x20000000 /* ECI available (rev >= 20) */
+#define SSB_CHIPCO_CAP_SPROM 0x40000000 /* SPROM present */
#define SSB_CHIPCO_CORECTL 0x0008
#define SSB_CHIPCO_CORECTL_UARTCLK0 0x00000001 /* Drive UART with internal clock */
#define SSB_CHIPCO_CORECTL_SE 0x00000002 /* sync clk out enable (corerev >= 3) */
@@ -385,6 +386,7 @@
/** Chip specific Chip-Status register contents. */
+#define SSB_CHIPCO_CHST_4322_SPROM_EXISTS 0x00000040 /* SPROM present */
#define SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL 0x00000003
#define SSB_CHIPCO_CHST_4325_DEFCIS_SEL 0 /* OTP is powered up, use def. CIS, no SPROM */
#define SSB_CHIPCO_CHST_4325_SPROM_SEL 1 /* OTP is powered up, SPROM is present */
@@ -398,6 +400,18 @@
#define SSB_CHIPCO_CHST_4325_RCAL_VALUE_SHIFT 4
#define SSB_CHIPCO_CHST_4325_PMUTOP_2B 0x00000200 /* 1 for 2b, 0 for to 2a */
+/** Macros to determine SPROM presence based on Chip-Status register. */
+#define SSB_CHIPCO_CHST_4312_SPROM_PRESENT(status) \
+ ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \
+ SSB_CHIPCO_CHST_4325_OTP_SEL)
+#define SSB_CHIPCO_CHST_4322_SPROM_PRESENT(status) \
+ (status & SSB_CHIPCO_CHST_4322_SPROM_EXISTS)
+#define SSB_CHIPCO_CHST_4325_SPROM_PRESENT(status) \
+ (((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \
+ SSB_CHIPCO_CHST_4325_DEFCIS_SEL) && \
+ ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \
+ SSB_CHIPCO_CHST_4325_OTP_SEL))
+
/** Clockcontrol masks and values **/
@@ -564,6 +578,7 @@ struct ssb_chipcommon_pmu {
struct ssb_chipcommon {
struct ssb_device *dev;
u32 capabilities;
+ u32 status;
/* Fast Powerup Delay constant */
u16 fast_pwrup_delay;
struct ssb_chipcommon_pmu pmu;
next prev parent reply other threads:[~2010-08-06 19:29 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-06 19:26 [00/36] 2.6.34.3-stable review Greg KH
2010-08-06 19:19 ` [01/36] mm: fix ia64 crash when gcore reads gate area Greg KH
2010-08-06 19:19 ` [02/36] NFS: kswapd must not block in nfs_release_page Greg KH
2010-08-06 19:19 ` [03/36] NFS: Fix a typo in include/linux/nfs_fs.h Greg KH
2010-08-06 19:19 ` [04/36] comedi: Uncripple 8255-based DIO subdevices Greg KH
2010-08-06 19:19 ` [05/36] PARISC: led.c - fix potential stack overflow in led_proc_write() Greg KH
2010-08-06 19:19 ` [06/36] arm/imx/gpio: add spinlock protection Greg KH
2010-08-06 19:19 ` [07/36] parisc: pass through \t to early (iodc) console Greg KH
2010-08-06 19:19 ` [08/36] amd64_edac: Fix DCT base address selector Greg KH
2010-08-06 19:19 ` [09/36] amd64_edac: Correct scrub rate setting Greg KH
2010-08-06 19:19 ` [10/36] amd64_edac: Fix operator precendence error Greg KH
2010-08-06 19:19 ` [11/36] e1000e: dont inadvertently re-set INTX_DISABLE Greg KH
2010-08-06 19:19 ` [12/36] e1000e: 82577/82578 PHY register access issues Greg KH
2010-08-06 19:19 ` [13/36] 9p: strlen() doesnt count the terminator Greg KH
2010-08-06 19:19 ` [14/36] igb: Use only a single Tx queue in SR-IOV mode Greg KH
2010-08-06 19:19 ` [15/36] ath9k: enable serialize_regmode for non-PCIE AR9160 Greg KH
2010-08-06 19:19 ` [16/36] ath9k: fix a potential buffer leak in the STA teardown path Greg KH
2010-08-06 19:19 ` [17/36] ath9k_hw: fix an off-by-one error in the PDADC boundaries calculation Greg KH
2010-08-06 19:19 ` [18/36] ath9k: fix TSF after reset on AR913x Greg KH
2010-08-06 19:20 ` [19/36] ath9k: fix yet another buffer leak in the tx aggregation code Greg KH
2010-08-06 19:20 ` [20/36] iwlwifi: fix scan abort Greg KH
2010-08-06 19:20 ` [21/36] cfg80211: ignore spurious deauth Greg KH
2010-08-06 19:20 ` [22/36] cfg80211: dont get expired BSSes Greg KH
2010-08-06 19:20 ` [23/36] mac80211: avoid scheduling while atomic in mesh_rx_plink_frame Greg KH
2010-08-06 19:20 ` [24/36] SCSI: enclosure: fix error path - actually return ERR_PTR() on error Greg KH
2010-08-06 19:20 ` [25/36] GFS2: rename causes kernel Oops Greg KH
2010-08-06 19:20 ` [26/36] KVM: MMU: flush remote tlbs when overwriting spte with different pfn Greg KH
2010-08-06 19:20 ` [27/36] xen: drop xen_sched_clock in favour of using plain wallclock time Greg KH
2010-08-06 19:20 ` [28/36] drm/radeon/kms/igp: sideport is AMD only Greg KH
2010-08-06 19:20 ` [29/36] drm/radeon: add new pci ids Greg KH
2010-08-06 19:20 ` [30/36] drm/radeon/kms/r7xx: add workaround for hw issue with HDP flush Greg KH
2010-08-06 19:20 ` [31/36] drm/i915: Check overlay stride errata for i830 and i845 Greg KH
2010-08-06 19:20 ` [32/36] Revert "ssb: Handle Netbook devices where the SPROM address is changed" Greg KH
2010-08-06 19:20 ` Greg KH [this message]
2010-08-06 19:20 ` [34/36] ssb: Look for SPROM at different offset on higher rev CC Greg KH
2010-08-06 19:20 ` [35/36] ssb: fix NULL ptr deref when pcihost_wrapper is used Greg KH
2010-08-06 19:20 ` [36/36] ssb: Handle alternate SSPROM location Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100806192117.424351093@clark.site \
--to=gregkh@suse.de \
--cc=Larry.Finger@lwfinger.net \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=ben@decadent.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=mb@bu3sch.de \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=zajec5@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox