Skip to content

Commit

Permalink
wl1251: fix oops on early interrupt
Browse files Browse the repository at this point in the history
This driver disables interrupt just after requesting it and enables it
later, after interface is up. However currently there is a time window
between request_irq() and disable_irq() where if interrupt arrives, the
driver oopses because it's not yet ready to process it. This can be
reproduced by inserting the module, associating and removing the module
multiple times.

Eliminate this race by setting IRQF_NOAUTOEN flag before request_irq().

Cc: stable@vger.kernel.org # v2.6.37+
Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Grazvydas Ignotas authored and John W. Linville committed May 25, 2012
1 parent 75813bd commit f380f2c
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 3 deletions.
2 changes: 1 addition & 1 deletion drivers/net/wireless/ti/wl1251/sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,14 +260,14 @@ static int wl1251_sdio_probe(struct sdio_func *func,
}

if (wl->irq) {
irq_set_status_flags(wl->irq, IRQ_NOAUTOEN);
ret = request_irq(wl->irq, wl1251_line_irq, 0, "wl1251", wl);
if (ret < 0) {
wl1251_error("request_irq() failed: %d", ret);
goto disable;
}

irq_set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING);
disable_irq(wl->irq);

wl1251_sdio_ops.enable_irq = wl1251_enable_line_irq;
wl1251_sdio_ops.disable_irq = wl1251_disable_line_irq;
Expand Down
3 changes: 1 addition & 2 deletions drivers/net/wireless/ti/wl1251/spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ static int __devinit wl1251_spi_probe(struct spi_device *spi)

wl->use_eeprom = pdata->use_eeprom;

irq_set_status_flags(wl->irq, IRQ_NOAUTOEN);
ret = request_irq(wl->irq, wl1251_irq, 0, DRIVER_NAME, wl);
if (ret < 0) {
wl1251_error("request_irq() failed: %d", ret);
Expand All @@ -289,8 +290,6 @@ static int __devinit wl1251_spi_probe(struct spi_device *spi)

irq_set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING);

disable_irq(wl->irq);

ret = wl1251_init_ieee80211(wl);
if (ret)
goto out_irq;
Expand Down

0 comments on commit f380f2c

Please sign in to comment.