[lkml]   [2006]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    SubjectRe: Bcm43xx softMac Driver in 2.6.18
    When we found the cause of NETDEV watchdog timeouts in the wireless-2.6 code, I knew that the 2.6.18 
    release code would cause a serious regression. I immediately prepared and tested a patch to fix
    this; however, I was unable to get it pushed into the stable code before release of 2.6.18. The
    following submission text and patch has been sent to the stable maintainers, which I hope is
    included in

    For people having these lockups with 2.6.18, please try this patch and inform me of the results,
    both positive and negative. The latter are particularly important.


    In 2.6.18, the section that prepares for preemptible periodic work
    has two bugs. The first is due to an improper locking sequence that leads
    to frozen systems. The second causes netdev watchdog timeouts. Both
    lead to serious regressions as compared with 2.6.17.

    Signed-off-by: Larry Finger <>

    This patch, which was originally sent to John Linville on 9/14/06,
    has been taken against 2.6.18. It changes more lines
    than would be absolutely necessary to affect the fix; however, it
    ends up with this section looking exactly like the current code (with
    pending patches) that is in wireless-2.6.


    Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
    --- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
    +++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
    @@ -3182,39 +3182,37 @@ static void bcm43xx_periodic_work_handle
    /* Periodic work will take a long time, so we want it to
    * be preemtible.
    - bcm43xx_lock_irqonly(bcm, flags);
    - netif_stop_queue(bcm->net_dev);
    + mutex_lock(&bcm->mutex);
    + netif_tx_disable(bcm->net_dev);
    + spin_lock_irqsave(&bcm->irq_lock, flags);
    + bcm43xx_mac_suspend(bcm);
    if (bcm43xx_using_pio(bcm))
    savedirqs = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
    - bcm43xx_unlock_irqonly(bcm, flags);
    - bcm43xx_lock_noirq(bcm);
    + spin_unlock_irqrestore(&bcm->irq_lock, flags);
    } else {
    /* Periodic work should take short time, so we want low
    * locking overhead.
    - bcm43xx_lock_irqsafe(bcm, flags);
    + mutex_lock(&bcm->mutex);
    + spin_lock_irqsave(&bcm->irq_lock, flags);


    if (badness > BADNESS_LIMIT) {
    - bcm43xx_lock_irqonly(bcm, flags);
    - if (likely(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED)) {
    - tasklet_enable(&bcm->isr_tasklet);
    - bcm43xx_interrupt_enable(bcm, savedirqs);
    - if (bcm43xx_using_pio(bcm))
    - bcm43xx_pio_thaw_txqueues(bcm);
    - }
    + spin_lock_irqsave(&bcm->irq_lock, flags);
    + tasklet_enable(&bcm->isr_tasklet);
    + bcm43xx_interrupt_enable(bcm, savedirqs);
    + if (bcm43xx_using_pio(bcm))
    + bcm43xx_pio_thaw_txqueues(bcm);
    + bcm43xx_mac_enable(bcm);
    - mmiowb();
    - bcm43xx_unlock_irqonly(bcm, flags);
    - bcm43xx_unlock_noirq(bcm);
    - } else {
    - mmiowb();
    - bcm43xx_unlock_irqsafe(bcm, flags);
    + mmiowb();
    + spin_unlock_irqrestore(&bcm->irq_lock, flags);
    + mutex_unlock(&bcm->mutex);

    static void bcm43xx_periodic_tasks_delete(struct bcm43xx_private *bcm)

    Bcm43xx-dev mailing list

    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at

     \ /
      Last update: 2006-09-22 15:23    [W:0.022 / U:3.472 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site