diff mbox

b44: Unconditionally enable interrupt routing on reset

Message ID 200811161537.30404.mb@bu3sch.de
State Not Applicable, archived
Headers show

Commit Message

Michael Buesch Nov. 16, 2008, 2:37 p.m. UTC
Unconditionally setup the IRQ routing on chip reset.
It's safe to call ssb_pcicore_dev_irqvecs_enable() unconditionally, because
it has internal checks for redundant calls.

This fixes problems where hardware will not come up properly
due to quirks in the enable-bit hardware.

Reported-by: Pantelis Koukousoulas <pktoss@gmail.com>
Signed-off-by: Michael Buesch <mb@bu3sch.de>

---

I'm not sure if we should push this for 2.6.28.
This fixes quirks when booting from PXE. So only a minority of
the b44 users are affected.

Comments

Pantelis Koukousoulas Feb. 15, 2009, 2:17 p.m. UTC | #1
Hi!

There's been 3 months since the last time this was posted so I assume
it was somehow lost.
This patch helps with pxe booting b44 laptops where the BIOS leaves
the card in a slightly
broken state causing nfsroot mount to hang indefinitely (due to no
interrupts coming).

Note that without the patch, one could say that it is the fragility of
the linux driver code
that turns a slight BIOS PXE bug into a broken card with no
interrupts, so the change
is imho worthy from a correctness point of view (more robust code).

I understand that it is a bit late for this patch to get to 2.6.29
(although it's been posted
over 3 months ago at first) but it would be *really* nice if it was at
least picked up into a
maintainer tree for the next merge window if possible.

Again, this patch is very straightforward and it has been tested daily
for the last 3 months
with no problems whatsoever.

Thanks in advance,
Pantelis


---------- Forwarded message ----------
From: Michael Buesch <mb@bu3sch.de>
Date: Sun, Nov 16, 2008 at 4:37 PM
Subject: [PATCH] b44: Unconditionally enable interrupt routing on reset
To: Jeff Garzik <jeff@garzik.org>
Cc: netdev@vger.kernel.org, Pantelis Koukousoulas <pktoss@gmail.com>,
Gary Zambrano <zambrano@broadcom.com>


Unconditionally setup the IRQ routing on chip reset.
It's safe to call ssb_pcicore_dev_irqvecs_enable() unconditionally, because
it has internal checks for redundant calls.

This fixes problems where hardware will not come up properly
due to quirks in the enable-bit hardware.

Reported-by: Pantelis Koukousoulas <pktoss@gmail.com>
Signed-off-by: Michael Buesch <mb@bu3sch.de>

---

I'm not sure if we should push this for 2.6.28.
This fixes quirks when booting from PXE. So only a minority of
the b44 users are affected.

Index: wireless-testing/drivers/net/b44.c
===================================================================
--- wireless-testing.orig/drivers/net/b44.c     2008-11-16
14:47:06.000000000 +0100
+++ wireless-testing/drivers/net/b44.c  2008-11-16 15:03:35.000000000 +0100
@@ -1266,8 +1266,14 @@ static void b44_clear_stats(struct b44 *
 static void b44_chip_reset(struct b44 *bp, int reset_kind)
 {
       struct ssb_device *sdev = bp->sdev;
+       bool was_enabled;

-       if (ssb_device_is_enabled(bp->sdev)) {
+       was_enabled = ssb_device_is_enabled(bp->sdev);
+
+       ssb_device_enable(bp->sdev, 0);
+       ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
+
+       if (was_enabled) {
               bw32(bp, B44_RCV_LAZY, 0);
               bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
               b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 200, 1);
@@ -1279,10 +1285,8 @@ static void b44_chip_reset(struct b44 *b
               }
               bw32(bp, B44_DMARX_CTRL, 0);
               bp->rx_prod = bp->rx_cons = 0;
-       } else
-               ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
+       }

-       ssb_device_enable(bp->sdev, 0);
       b44_clear_stats(bp);

       /*

--
Greetings Michael.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller Feb. 27, 2009, 6:33 a.m. UTC | #2
I've applied this patch, even though it was insanely mangled
by your email client (tabs turned into spaces, lines chopped
up, etc.)
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

Index: wireless-testing/drivers/net/b44.c
===================================================================
--- wireless-testing.orig/drivers/net/b44.c	2008-11-16 14:47:06.000000000 +0100
+++ wireless-testing/drivers/net/b44.c	2008-11-16 15:03:35.000000000 +0100
@@ -1266,8 +1266,14 @@  static void b44_clear_stats(struct b44 *
 static void b44_chip_reset(struct b44 *bp, int reset_kind)
 {
 	struct ssb_device *sdev = bp->sdev;
+	bool was_enabled;
 
-	if (ssb_device_is_enabled(bp->sdev)) {
+	was_enabled = ssb_device_is_enabled(bp->sdev);
+
+	ssb_device_enable(bp->sdev, 0);
+	ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
+
+	if (was_enabled) {
 		bw32(bp, B44_RCV_LAZY, 0);
 		bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
 		b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 200, 1);
@@ -1279,10 +1285,8 @@  static void b44_chip_reset(struct b44 *b
 		}
 		bw32(bp, B44_DMARX_CTRL, 0);
 		bp->rx_prod = bp->rx_cons = 0;
-	} else
-		ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
+	}
 
-	ssb_device_enable(bp->sdev, 0);
 	b44_clear_stats(bp);
 
 	/*