From 1d5aa4a516934c384b4a330a086eec31f9b670dd Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 7 Jun 2012 10:54:35 +0900 Subject: [PATCH] 3.0-stable patches added patches: wl1251-fix-oops-on-early-interrupt.patch --- queue-3.0/series | 1 + .../wl1251-fix-oops-on-early-interrupt.patch | 64 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 queue-3.0/wl1251-fix-oops-on-early-interrupt.patch diff --git a/queue-3.0/series b/queue-3.0/series index 82e8e9cd5fe..6057249a552 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -44,3 +44,4 @@ ext4-add-ext4_mb_unload_buddy-in-the-error-path.patch ext4-remove-mb_groups-before-tearing-down-the-buddy_cache.patch drm-radeon-kms-add-new-btc-pci-ids.patch acpi-battery-only-refresh-the-sysfs-files-when-pertinent-information-changes.patch +wl1251-fix-oops-on-early-interrupt.patch diff --git a/queue-3.0/wl1251-fix-oops-on-early-interrupt.patch b/queue-3.0/wl1251-fix-oops-on-early-interrupt.patch new file mode 100644 index 00000000000..fc1a5f7d89f --- /dev/null +++ b/queue-3.0/wl1251-fix-oops-on-early-interrupt.patch @@ -0,0 +1,64 @@ +From f380f2c4a12e913356bd49f8790ec1063c4fe9f8 Mon Sep 17 00:00:00 2001 +From: Grazvydas Ignotas +Date: Fri, 18 May 2012 03:04:08 +0300 +Subject: wl1251: fix oops on early interrupt + +From: Grazvydas Ignotas + +commit f380f2c4a12e913356bd49f8790ec1063c4fe9f8 upstream. + +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(). + +Signed-off-by: Grazvydas Ignotas +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/wl1251/sdio.c | 2 +- + drivers/net/wireless/wl1251/spi.c | 3 +-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/wl1251/sdio.c ++++ b/drivers/net/wireless/wl1251/sdio.c +@@ -259,6 +259,7 @@ static int wl1251_sdio_probe(struct sdio + } + + 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); +@@ -266,7 +267,6 @@ static int wl1251_sdio_probe(struct sdio + } + + 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; +--- a/drivers/net/wireless/wl1251/spi.c ++++ b/drivers/net/wireless/wl1251/spi.c +@@ -280,6 +280,7 @@ static int __devinit wl1251_spi_probe(st + + 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); +@@ -288,8 +289,6 @@ static int __devinit wl1251_spi_probe(st + + irq_set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING); + +- disable_irq(wl->irq); +- + ret = wl1251_init_ieee80211(wl); + if (ret) + goto out_irq; -- 2.47.3