linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC/RFT] ssb: Avoid system hang when SPROM read fails
@ 2010-04-25 22:30 Larry Finger
  2010-04-26 17:15 ` John W. Linville
  0 siblings, 1 reply; 4+ messages in thread
From: Larry Finger @ 2010-04-25 22:30 UTC (permalink / raw)
  To: John W Linville, Michael Buesch; +Cc: b43-dev, linux-wireless

In kernel Bugzilla #15825, the OP reports a case of intermittent reading
of the SPROM. If such reads fail, the box hangs. Thanks to careful testing
by bugzillakernelorg@lez.ath.cx has shown that the first read of the
SPROM returns 0xFFFF with the hang happening on the next read.

The source of the read failure is still under investigation; however,
this patch does avoid the system hang.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---

John,

Does this patch avoid the system hang on your box?

Larry
---

===================================================================
--- wireless-testing.orig/drivers/ssb/pci.c
+++ wireless-testing/drivers/ssb/pci.c
@@ -253,6 +253,11 @@ static int sprom_do_read(struct ssb_bus
 {
 	int i;
 
+	/* Check if SPROM can be read */
+	if (ioread16(bus->mmio + SSB_SPROM_BASE) == 0xFFFF) {
+		ssb_printk(KERN_ERR PFX "Unable to read SPROM\n");
+		return -ENODEV;
+	}
 	for (i = 0; i < bus->sprom_size; i++)
 		sprom[i] = ioread16(bus->mmio + SSB_SPROM_BASE + (i * 2));
 
@@ -625,17 +630,23 @@ static int ssb_pci_sprom_get(struct ssb_
 	if (!buf)
 		goto out;
 	bus->sprom_size = SSB_SPROMSIZE_WORDS_R123;
-	sprom_do_read(bus, buf);
+	err = sprom_do_read(bus, buf);
+	if (err)
+		goto out_free;
 	err = sprom_check_crc(buf, bus->sprom_size);
 	if (err) {
 		/* try for a 440 byte SPROM - revision 4 and higher */
 		kfree(buf);
 		buf = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
 			      GFP_KERNEL);
-		if (!buf)
+		if (!buf) {
+			err = -ENOMEM;
 			goto out;
+		}
 		bus->sprom_size = SSB_SPROMSIZE_WORDS_R4;
-		sprom_do_read(bus, buf);
+		err = sprom_do_read(bus, buf);
+		if (err)
+			goto out_free;
 		err = sprom_check_crc(buf, bus->sprom_size);
 		if (err) {
 			/* All CRC attempts failed.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-04-26 18:45 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-25 22:30 [RFC/RFT] ssb: Avoid system hang when SPROM read fails Larry Finger
2010-04-26 17:15 ` John W. Linville
2010-04-26 18:04   ` Larry Finger
2010-04-26 18:32     ` John W. Linville

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).