--- /dev/null
+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);