Messages in this thread Patch in this message | | | From | Michael Buesch <> | Subject | Re: Linux 2.6.17.1 | Date | Tue, 20 Jun 2006 12:35:19 +0200 |
| |
On Tuesday 20 June 2006 12:13, Chris Wright wrote: > We (the -stable team) are announcing the release of the 2.6.17.1 kernel.
Please consider inclusion of the following patch into 2.6.17.2:
It fixes a possible crash. Might be triggerable in networks with heavy traffic. I only saw it once so far, though.
--
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>
Index: tmp/drivers/net/wireless/bcm43xx/bcm43xx_main.c =================================================================== --- tmp.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c 2006-06-18 18:51:48.000000000 +0200 +++ tmp/drivers/net/wireless/bcm43xx/bcm43xx_main.c 2006-06-18 19:02:19.000000000 +0200 @@ -1870,6 +1870,15 @@ 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 @@ 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);
-- Greetings Michael. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |