From 62dfd65303ac7a30c4dad7242d500ca175344684 Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Wed, 7 Nov 2007 18:33:37 +0100 Subject: [PATCH] --- yaml --- r: 73455 b: refs/heads/master c: 440cb58a7aa979fabb02a38e55bfe93adde0f41c h: refs/heads/master i: 73453: f6721cf9b02427fec54dc693f833c59f4be7e01d 73451: b2d05f5a20019c42495c3c30ad01f93b1583f044 73447: 1769117fdc7f9b7230b062aacd71afd774d39169 73439: ff4591a3b8d6ccda66d47031c08d39f4095d88e6 v: v3 --- [refs] | 2 +- trunk/drivers/net/wireless/b43legacy/main.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 1616ffd0cba8..c8b00b02e886 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a19d12d742903c745890c1374d64092595571e40 +refs/heads/master: 440cb58a7aa979fabb02a38e55bfe93adde0f41c diff --git a/trunk/drivers/net/wireless/b43legacy/main.c b/trunk/drivers/net/wireless/b43legacy/main.c index f0e56dfc9ecf..1ebb787ef9cf 100644 --- a/trunk/drivers/net/wireless/b43legacy/main.c +++ b/trunk/drivers/net/wireless/b43legacy/main.c @@ -2781,6 +2781,17 @@ static void b43legacy_wireless_core_stop(struct b43legacy_wldev *dev) if (b43legacy_status(dev) < B43legacy_STAT_STARTED) 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 = b43legacy_interrupt_disable(dev, + B43legacy_IRQ_ALL); + b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_MASK); /* flush */ + spin_unlock_irqrestore(&wl->irq_lock, flags); + b43legacy_synchronize_irq(dev); + b43legacy_set_status(dev, B43legacy_STAT_INITIALIZED); mutex_unlock(&wl->mutex); @@ -2791,14 +2802,6 @@ static void b43legacy_wireless_core_stop(struct b43legacy_wldev *dev) ieee80211_stop_queues(wl->hw); /* FIXME this could cause a deadlock */ - /* Disable and sync interrupts. */ - spin_lock_irqsave(&wl->irq_lock, flags); - dev->irq_savedstate = b43legacy_interrupt_disable(dev, - B43legacy_IRQ_ALL); - b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_MASK); /* flush */ - spin_unlock_irqrestore(&wl->irq_lock, flags); - b43legacy_synchronize_irq(dev); - b43legacy_mac_suspend(dev); free_irq(dev->dev->irq, dev); b43legacydbg(wl, "Wireless interface stopped\n");