]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Add bcm43xx init fix from Michael Buesch
authorChris Wright <chrisw@sous-sol.org>
Tue, 20 Jun 2006 22:52:29 +0000 (15:52 -0700)
committerChris Wright <chrisw@sous-sol.org>
Tue, 20 Jun 2006 22:52:29 +0000 (15:52 -0700)
queue-2.6.17/bcm43xx-init-fix-for-possible-machine-check.patch [new file with mode: 0644]
queue-2.6.17/series

diff --git a/queue-2.6.17/bcm43xx-init-fix-for-possible-machine-check.patch b/queue-2.6.17/bcm43xx-init-fix-for-possible-machine-check.patch
new file mode 100644 (file)
index 0000000..962ae67
--- /dev/null
@@ -0,0 +1,64 @@
+From mb@bu3sch.de  Sun Jun 18 10:09:06 2006
+Date: Sun, 18 Jun 2006 19:05:10 +0200
+From: Michael Buesch <mb@bu3sch.de>
+To: Greg KH <gregkh@suse.de>
+Cc: Andre Tomt <andre@tomt.net>, Linus Torvalds <torvalds@osdl.org>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, Chris Wright <chrisw@sous-sol.org>, bcm43xx-dev@lists.berlios.de
+Subject: bcm43xx: init fix for possible Machine Check
+
+Place the Init-vs-IRQ workaround before any card register
+access, because we might not have the wireless core mapped
+at all times in init. So this will result in a Machine Check
+caused by a bus error.
+
+Signed-off-by: Michael Buesch <mb@bu3sch.de>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+
+---
+ drivers/net/wireless/bcm43xx/bcm43xx_main.c |   28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+--- linux-2.6.17.1.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
++++ linux-2.6.17.1/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+@@ -1870,6 +1870,15 @@ static irqreturn_t bcm43xx_interrupt_han
+       spin_lock(&bcm->_lock);
++      /* Only accept IRQs, if we are initialized properly.
++       * This avoids an RX race while initializing.
++       * We should probably not enable IRQs before we are initialized
++       * completely, but some careful work is needed to fix this. I think it
++       * is best to stay with this cheap workaround for now... .
++       */
++      if (unlikely(!bcm->initialized))
++              goto out;
++
+       reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
+       if (reason == 0xffffffff) {
+               /* irq not for us (shared irq) */
+@@ -1891,20 +1900,11 @@ static irqreturn_t bcm43xx_interrupt_han
+       bcm43xx_interrupt_ack(bcm, reason);
+-      /* Only accept IRQs, if we are initialized properly.
+-       * This avoids an RX race while initializing.
+-       * We should probably not enable IRQs before we are initialized
+-       * completely, but some careful work is needed to fix this. I think it
+-       * is best to stay with this cheap workaround for now... .
+-       */
+-      if (likely(bcm->initialized)) {
+-              /* disable all IRQs. They are enabled again in the bottom half. */
+-              bcm->irq_savedstate = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
+-              /* save the reason code and call our bottom half. */
+-              bcm->irq_reason = reason;
+-              tasklet_schedule(&bcm->isr_tasklet);
+-      }
+-
++      /* disable all IRQs. They are enabled again in the bottom half. */
++      bcm->irq_savedstate = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
++      /* save the reason code and call our bottom half. */
++      bcm->irq_reason = reason;
++      tasklet_schedule(&bcm->isr_tasklet);
+ out:
+       mmiowb();
+       spin_unlock(&bcm->_lock);
index c7a2e5f784dcde1780e860a3419cf5ebb9c8446e..9563fb65991a7e839d7e4a171edc1f9f6559d392 100644 (file)
@@ -11,3 +11,4 @@ ethtool-fix-ufo-typo.patch
 sparc32-fix-iommu_flush_iotlb-end-address.patch
 ntfs-critical-bug-fix.patch
 x86-compile-fix-for-asm-i386-alternatives.h.patch
+bcm43xx-init-fix-for-possible-machine-check.patch