Usual fix:
- b44_interrupt() does not schedule NAPI polling when the device is
  going down;
- b44_close() waits for any scheduled NAPI polling before it starts
  to release the device private structures.

Signed-off-by: Francois Romieu <[EMAIL PROTECTED]>

---

466c09c176a11241f93af7156538f3dd5f6fb6d1
diff --git a/drivers/net/b44.c b/drivers/net/b44.c
--- a/drivers/net/b44.c
+++ b/drivers/net/b44.c
@@ -909,6 +909,12 @@ static irqreturn_t b44_interrupt(int irq
        istat &= imask;
        if (istat) {
                handled = 1;
+
+               if (unlikely(!netif_running(dev))) {
+                       printk(KERN_INFO "%s: late interrupt.\n", dev->name);
+                       goto out_unlock;
+               }
+
                if (netif_rx_schedule_prep(dev)) {
                        /* NOTE: These writes are posted by the readback of
                         *       the ISTAT register below.
@@ -924,6 +930,7 @@ static irqreturn_t b44_interrupt(int irq
                bw32(bp, B44_ISTAT, istat);
                br32(bp, B44_ISTAT);
        }
+out_unlock:
        spin_unlock(&bp->lock);
        return IRQ_RETVAL(handled);
 }
@@ -1446,6 +1453,8 @@ static int b44_close(struct net_device *
 
        netif_stop_queue(dev);
 
+       netif_poll_disable(dev);
+
        del_timer_sync(&bp->timer);
 
        spin_lock_irq(&bp->lock);
@@ -1461,6 +1470,8 @@ static int b44_close(struct net_device *
 
        free_irq(dev->irq, dev);
 
+       netif_poll_enable(dev);
+
        b44_free_consistent(bp);
 
        return 0;
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to