aboutsummaryrefslogtreecommitdiff
path: root/drivers/net/wireless/zd1211rw
diff options
context:
space:
mode:
authorUlrich Kunitz <kune@deine-taler.de>2006-11-22 00:06:06 +0000
committerJohn W. Linville <linville@tuxdriver.com>2006-11-28 14:10:48 -0500
commita68077defb3337342981a0d3a4df3380496a8a87 (patch)
tree334fc72579b624314ced6058efc59707e39bb375 /drivers/net/wireless/zd1211rw
parenta3df3b6f2e37474cdb8b56d55d31be41c22f9b18 (diff)
[PATCH] zd1211rw: Fix of a locking bug
This patch fixes the bug as reported in the kernel bug tracker under the id 7244. The bug was simply that the interrupt lock has been locked outside an interrupt without blocking the interrupt. Signed-off-by: Ulrich Kunitz <kune@deine-taler.de> Signed-off-by: Daniel Drake <dsd@gentoo.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/zd1211rw')
-rw-r--r--drivers/net/wireless/zd1211rw/zd_usb.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c
index 3faaeb2b7c8..a15b0954924 100644
--- a/drivers/net/wireless/zd1211rw/zd_usb.c
+++ b/drivers/net/wireless/zd1211rw/zd_usb.c
@@ -366,15 +366,6 @@ error:
return r;
}
-static void disable_read_regs_int(struct zd_usb *usb)
-{
- struct zd_usb_interrupt *intr = &usb->intr;
-
- spin_lock(&intr->lock);
- intr->read_regs_enabled = 0;
- spin_unlock(&intr->lock);
-}
-
#define urb_dev(urb) (&(urb)->dev->dev)
static inline void handle_regs_int(struct urb *urb)
@@ -1156,10 +1147,19 @@ static void prepare_read_regs_int(struct zd_usb *usb)
{
struct zd_usb_interrupt *intr = &usb->intr;
- spin_lock(&intr->lock);
+ spin_lock_irq(&intr->lock);
intr->read_regs_enabled = 1;
INIT_COMPLETION(intr->read_regs.completion);
- spin_unlock(&intr->lock);
+ spin_unlock_irq(&intr->lock);
+}
+
+static void disable_read_regs_int(struct zd_usb *usb)
+{
+ struct zd_usb_interrupt *intr = &usb->intr;
+
+ spin_lock_irq(&intr->lock);
+ intr->read_regs_enabled = 0;
+ spin_unlock_irq(&intr->lock);
}
static int get_results(struct zd_usb *usb, u16 *values,
@@ -1171,7 +1171,7 @@ static int get_results(struct zd_usb *usb, u16 *values,
struct read_regs_int *rr = &intr->read_regs;
struct usb_int_regs *regs = (struct usb_int_regs *)rr->buffer;
- spin_lock(&intr->lock);
+ spin_lock_irq(&intr->lock);
r = -EIO;
/* The created block size seems to be larger than expected.
@@ -1204,7 +1204,7 @@ static int get_results(struct zd_usb *usb, u16 *values,
r = 0;
error_unlock:
- spin_unlock(&intr->lock);
+ spin_unlock_irq(&intr->lock);
return r;
}