|
@@ -2985,6 +2985,16 @@ static void b43_wireless_core_stop(struct b43_wldev *dev)
|
|
|
|
|
|
if (b43_status(dev) < B43_STAT_STARTED)
|
|
if (b43_status(dev) < B43_STAT_STARTED)
|
|
return;
|
|
return;
|
|
|
|
+
|
|
|
|
+ /* Disable and sync interrupts. We must do this before than
|
|
|
|
+ * setting the status to INITIALIZED, as the interrupt handler
|
|
|
|
+ * won't care about IRQs then. */
|
|
|
|
+ spin_lock_irqsave(&wl->irq_lock, flags);
|
|
|
|
+ dev->irq_savedstate = b43_interrupt_disable(dev, B43_IRQ_ALL);
|
|
|
|
+ b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* flush */
|
|
|
|
+ spin_unlock_irqrestore(&wl->irq_lock, flags);
|
|
|
|
+ b43_synchronize_irq(dev);
|
|
|
|
+
|
|
b43_set_status(dev, B43_STAT_INITIALIZED);
|
|
b43_set_status(dev, B43_STAT_INITIALIZED);
|
|
|
|
|
|
mutex_unlock(&wl->mutex);
|
|
mutex_unlock(&wl->mutex);
|
|
@@ -2995,13 +3005,6 @@ static void b43_wireless_core_stop(struct b43_wldev *dev)
|
|
|
|
|
|
ieee80211_stop_queues(wl->hw); //FIXME this could cause a deadlock, as mac80211 seems buggy.
|
|
ieee80211_stop_queues(wl->hw); //FIXME this could cause a deadlock, as mac80211 seems buggy.
|
|
|
|
|
|
- /* Disable and sync interrupts. */
|
|
|
|
- spin_lock_irqsave(&wl->irq_lock, flags);
|
|
|
|
- dev->irq_savedstate = b43_interrupt_disable(dev, B43_IRQ_ALL);
|
|
|
|
- b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* flush */
|
|
|
|
- spin_unlock_irqrestore(&wl->irq_lock, flags);
|
|
|
|
- b43_synchronize_irq(dev);
|
|
|
|
-
|
|
|
|
b43_mac_suspend(dev);
|
|
b43_mac_suspend(dev);
|
|
free_irq(dev->dev->irq, dev);
|
|
free_irq(dev->dev->irq, dev);
|
|
b43dbg(wl, "Wireless interface stopped\n");
|
|
b43dbg(wl, "Wireless interface stopped\n");
|