summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/rt2x00
diff options
context:
space:
mode:
authorHelmut Schaa <helmut.schaa@googlemail.com>2010-10-02 13:34:05 +0400
committerJohn W. Linville <linville@tuxdriver.com>2010-10-05 21:35:29 +0400
commit1f0280cb35ae252d6db3ce8f56b7a1dc174460e5 (patch)
tree2d1320627d667024c988174897bf8b07a1ed1a95 /drivers/net/wireless/rt2x00
parent74ee3802c0021c1387795af234b3e4dc511a9bb3 (diff)
downloadlinux-1f0280cb35ae252d6db3ce8f56b7a1dc174460e5.tar.xz
rt2x00: Fix oops caused by error path in rt2x00lib_start
When rt2x00lib_enable_radio fails to enable the radio, rt2x00lib_start will call rt2x00queue_uninitialize to uninitialize the queues. Since, the queues are not initialized here but already in rt2x00lib_initialize we shouldn't uninitialize the queues here. Otherwise, a consecutive call to rt2x00lib_start will oops (see below) because it assumes the queues are already initialized. BUG: unable to handle kernel NULL pointer dereference at 00000010 IP: [<f8d2d901>] :rt2800pci:rt2800pci_clear_entry+0x1/0x40 *pde = 00000000 Oops: 0000 [#1] SMP Modules linked in: ... rt2800pci ... Pid: 5995, comm: hostapd Not tainted (2.6.27.8 #1) EIP: 0060:[<f8d2d901>] EFLAGS: 00210246 CPU: 3 EIP is at rt2800pci_clear_entry+0x1/0x40 [rt2800pci] EAX: 00000000 EBX: f698863c ECX: 00200296 EDX: f8d2dee0 ESI: f6988600 EDI: f5b6f000 EBP: 00000000 ESP: f6d75e4c DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 Process hostapd (pid: 5995, ti=f6d74000 task=f6ce2300 task.ti=f6d74000) Stack: f698863c fa00eaec 00000000 f5b6f000 00000000 f7b67000 f5b6e280 fa00c629 f5b6f000 00000000 fa00ca3d f7b67480 00000001 fa177d4c 01b6e890 f7b67000 00000000 f7b67000 00000001 00001003 00001002 c066c366 f7b67000 c0668ad0 Call Trace: [<fa00eaec>] rt2x00queue_init_queues+0x5c/0x90 [rt2x00lib] [<fa00c629>] rt2x00lib_enable_radio+0x29/0xa0 [rt2x00lib] [<fa00ca3d>] rt2x00lib_start+0x5d/0xd0 [rt2x00lib] [<fa177d4c>] ieee80211_do_open+0x21c/0x510 [mac80211] [<c066c366>] dev_open+0x56/0xb0 [<c0668ad0>] dev_set_rx_mode+0x20/0x40 [<c066a67f>] dev_change_flags+0x7f/0x190 [<c06b1495>] devinet_ioctl+0x515/0x690 [<c0668d24>] __dev_get_by_name+0x74/0x90 [<c065d3f0>] sock_ioctl+0xd0/0x240 [<c065d320>] sock_ioctl+0x0/0x240 [<c018179b>] vfs_ioctl+0x2b/0x90 [<c0181a5b>] do_vfs_ioctl+0x25b/0x2a0 [<c0181af6>] sys_ioctl+0x56/0x70 [<c0103262>] syscall_call+0x7/0xb [<c0700000>] add_card+0xad0/0xba0 ======================= Code: 83 78 08 0e 74 14 8b 02 8b 48 04 85 c9 0f 99 c0 0f b6 c0 c3 8d b6 00 00 00 00 8b 02 8b 40 04 85 c0 0f 99 c0 0f b6 c0 c3 66 90 53 <8b> 48 10 8b 58 08 8b 40 04 83 78 08 0e 74 15 8b 11 83 c2 04 8b EIP: [<f8d2d901>] rt2800pci_clear_entry+0x1/0x40 [rt2800pci] SS:ESP 0068:f6d75e4c ---[ end trace cff9a5c094bb8837 ]--- Reported-by: Joshua Smith <jesmith@kaon.com> Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index b03e6e41dc1e..6f442b02b83e 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -933,10 +933,8 @@ int rt2x00lib_start(struct rt2x00_dev *rt2x00dev)
/* Enable the radio */
retval = rt2x00lib_enable_radio(rt2x00dev);
- if (retval) {
- rt2x00queue_uninitialize(rt2x00dev);
+ if (retval)
return retval;
- }
set_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags);