]> err.no Git - linux-2.6/commitdiff
[PATCH] bcm43xx: Workaround init_board vs IRQ race.
authorMichael Buesch <mbuesch@freenet.de>
Tue, 21 Feb 2006 16:58:18 +0000 (17:58 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 27 Mar 2006 16:18:38 +0000 (11:18 -0500)
The proper fix for this is to move IRQ enabling to the end of
init_board. But this is nontrivial and needs to be done with care.
Stay with this cheap workaround for now.

Signed-off-by: Michael Buesch <mbuesch@freenet.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/bcm43xx/bcm43xx_main.c

index 6195c2a1516d689185d16f8471e0a22215d6aa73..57306a65840757f1366582061a9b7fa6e55e6cee 100644 (file)
@@ -2079,12 +2079,19 @@ static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id, struct pt_re
 
        bcm43xx_interrupt_ack(bcm, reason, mask);
 
-       /* 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);
+       /* 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);
+       }
 
        spin_unlock(&bcm->lock);