lkml.org 
[lkml]   [2006]   [Jun]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 14/25] bcm43xx: init fix for possible Machine Check
    -stable review patch.  If anyone has any objections, please let us know.
    ------------------

    From: Michael Buesch <mb@bu3sch.de>

    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);
    --
    -
    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/

    \
     
     \ /
      Last update: 2006-06-27 22:19    [W:0.023 / U:130.312 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site