]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.0-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 7 Jun 2012 01:54:35 +0000 (10:54 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 7 Jun 2012 01:54:35 +0000 (10:54 +0900)
added patches:
wl1251-fix-oops-on-early-interrupt.patch

queue-3.0/series
queue-3.0/wl1251-fix-oops-on-early-interrupt.patch [new file with mode: 0644]

index 82e8e9cd5fea26af189a3e9c8434364959b70fcf..6057249a5521453f0ee3090c296ccb371982cef6 100644 (file)
@@ -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 (file)
index 0000000..fc1a5f7
--- /dev/null
@@ -0,0 +1,64 @@
+From f380f2c4a12e913356bd49f8790ec1063c4fe9f8 Mon Sep 17 00:00:00 2001
+From: Grazvydas Ignotas <notasas@gmail.com>
+Date: Fri, 18 May 2012 03:04:08 +0300
+Subject: wl1251: fix oops on early interrupt
+
+From: Grazvydas Ignotas <notasas@gmail.com>
+
+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 <notasas@gmail.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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;