diff options
author | Michael Buesch <mb@bu3sch.de> | 2009-09-11 10:00:19 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-09-23 11:35:44 -0400 |
commit | a8696c800b8154e27b359866f7b837079cdb513a (patch) | |
tree | 6407ebbe05d64a5f070faac02b3464102e572661 | |
parent | ce6c4a13927bc0418169fe543c6614abfab051eb (diff) |
b43: Fix SDIO interrupt handler deadlock
We need to release the SDIO host before locking the driver mutex.
Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/b43/main.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/b43/sdio.c | 5 |
2 files changed, 5 insertions, 6 deletions
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 950a838757c4..5b0aeff01dbf 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -1914,20 +1914,14 @@ static irqreturn_t b43_interrupt_handler(int irq, void *dev_id) | |||
1914 | static void b43_sdio_interrupt_handler(struct b43_wldev *dev) | 1914 | static void b43_sdio_interrupt_handler(struct b43_wldev *dev) |
1915 | { | 1915 | { |
1916 | struct b43_wl *wl = dev->wl; | 1916 | struct b43_wl *wl = dev->wl; |
1917 | struct sdio_func *func = dev->dev->bus->host_sdio; | ||
1918 | irqreturn_t ret; | 1917 | irqreturn_t ret; |
1919 | 1918 | ||
1920 | if (unlikely(b43_status(dev) < B43_STAT_STARTED)) | ||
1921 | return; | ||
1922 | |||
1923 | mutex_lock(&wl->mutex); | 1919 | mutex_lock(&wl->mutex); |
1924 | sdio_release_host(func); | ||
1925 | 1920 | ||
1926 | ret = b43_do_interrupt(dev); | 1921 | ret = b43_do_interrupt(dev); |
1927 | if (ret == IRQ_WAKE_THREAD) | 1922 | if (ret == IRQ_WAKE_THREAD) |
1928 | b43_do_interrupt_thread(dev); | 1923 | b43_do_interrupt_thread(dev); |
1929 | 1924 | ||
1930 | sdio_claim_host(func); | ||
1931 | mutex_unlock(&wl->mutex); | 1925 | mutex_unlock(&wl->mutex); |
1932 | } | 1926 | } |
1933 | 1927 | ||
diff --git a/drivers/net/wireless/b43/sdio.c b/drivers/net/wireless/b43/sdio.c index 2d337f1a60b2..0d3ac64147a5 100644 --- a/drivers/net/wireless/b43/sdio.c +++ b/drivers/net/wireless/b43/sdio.c | |||
@@ -54,7 +54,12 @@ static void b43_sdio_interrupt_dispatcher(struct sdio_func *func) | |||
54 | struct b43_sdio *sdio = sdio_get_drvdata(func); | 54 | struct b43_sdio *sdio = sdio_get_drvdata(func); |
55 | struct b43_wldev *dev = sdio->irq_handler_opaque; | 55 | struct b43_wldev *dev = sdio->irq_handler_opaque; |
56 | 56 | ||
57 | if (unlikely(b43_status(dev) < B43_STAT_STARTED)) | ||
58 | return; | ||
59 | |||
60 | sdio_release_host(func); | ||
57 | sdio->irq_handler(dev); | 61 | sdio->irq_handler(dev); |
62 | sdio_claim_host(func); | ||
58 | } | 63 | } |
59 | 64 | ||
60 | int b43_sdio_request_irq(struct b43_wldev *dev, | 65 | int b43_sdio_request_irq(struct b43_wldev *dev, |