b44: fix resume, request_irq after hw reset
[pandora-kernel.git] / drivers / net / b44.c
index 8e7c8a8..171da7f 100644 (file)
@@ -2296,18 +2296,27 @@ static int b44_resume(struct ssb_device *sdev)
        if (!netif_running(dev))
                return 0;
 
+       spin_lock_irq(&bp->lock);
+       b44_init_rings(bp);
+       b44_init_hw(bp, B44_FULL_RESET);
+       spin_unlock_irq(&bp->lock);
+
+       /*
+        * As a shared interrupt, the handler can be called immediately. To be
+        * able to check the interrupt status the hardware must already be
+        * powered back on (b44_init_hw).
+        */
        rc = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev);
        if (rc) {
                netdev_err(dev, "request_irq failed\n");
+               spin_lock_irq(&bp->lock);
+               b44_halt(bp);
+               b44_free_rings(bp);
+               spin_unlock_irq(&bp->lock);
                return rc;
        }
 
-       spin_lock_irq(&bp->lock);
-
-       b44_init_rings(bp);
-       b44_init_hw(bp, B44_FULL_RESET);
        netif_device_attach(bp->dev);
-       spin_unlock_irq(&bp->lock);
 
        b44_enable_ints(bp);
        netif_wake_queue(dev);