Skip to content

Commit

Permalink
b43: Fix SDIO interrupt handler deadlock
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michael Buesch authored and John W. Linville committed Sep 23, 2009
1 parent ce6c4a1 commit a8696c8
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 6 deletions.
6 changes: 0 additions & 6 deletions drivers/net/wireless/b43/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1914,20 +1914,14 @@ static irqreturn_t b43_interrupt_handler(int irq, void *dev_id)
static void b43_sdio_interrupt_handler(struct b43_wldev *dev)
{
struct b43_wl *wl = dev->wl;
struct sdio_func *func = dev->dev->bus->host_sdio;
irqreturn_t ret;

if (unlikely(b43_status(dev) < B43_STAT_STARTED))
return;

mutex_lock(&wl->mutex);
sdio_release_host(func);

ret = b43_do_interrupt(dev);
if (ret == IRQ_WAKE_THREAD)
b43_do_interrupt_thread(dev);

sdio_claim_host(func);
mutex_unlock(&wl->mutex);
}

Expand Down
5 changes: 5 additions & 0 deletions drivers/net/wireless/b43/sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,12 @@ static void b43_sdio_interrupt_dispatcher(struct sdio_func *func)
struct b43_sdio *sdio = sdio_get_drvdata(func);
struct b43_wldev *dev = sdio->irq_handler_opaque;

if (unlikely(b43_status(dev) < B43_STAT_STARTED))
return;

sdio_release_host(func);
sdio->irq_handler(dev);
sdio_claim_host(func);
}

int b43_sdio_request_irq(struct b43_wldev *dev,
Expand Down

0 comments on commit a8696c8

Please sign in to comment.