[rt2x00-users] [PATCH] rt2x00: Don't queue ieee80211 work after USB removal
Sean Cross
sean at chumby.com
Fri Oct 30 07:30:02 UTC 2009
This prevents the rt2x00 driver from queueing ieee80211 work after the
USB card has been removed, preventing a kernel panic.
Signed-off-by: Sean Cross <sean at chumby.com>
---
Index: drivers/net/wireless/rt2x00/rt2x00usb.c
===================================================================
--- drivers/net/wireless/rt2x00/rt2x00usb.c (revision 23508)
+++ drivers/net/wireless/rt2x00/rt2x00usb.c (working copy)
@@ -60,8 +60,11 @@
* -ENODEV: Device has disappeared, no point continuing.
* All other errors: Try again.
*/
- else if (status == -ENODEV)
+ else if (status == -ENODEV) {
+ clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
+ clear_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags);
break;
+ }
}
ERROR(rt2x00dev,
Index: drivers/net/wireless/rt2x00/rt2x00link.c
===================================================================
--- drivers/net/wireless/rt2x00/rt2x00link.c (revision 23508)
+++ drivers/net/wireless/rt2x00/rt2x00link.c (working copy)
@@ -23,6 +23,7 @@
Abstract: rt2x00 generic link tuning routines.
*/
+
#include <linux/kernel.h>
#include <linux/module.h>
@@ -362,8 +363,9 @@
rt2x00link_reset_tuner(rt2x00dev, false);
- ieee80211_queue_delayed_work(rt2x00dev->hw,
- &link->work, LINK_TUNE_INTERVAL);
+ if(test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
+ ieee80211_queue_delayed_work(rt2x00dev->hw,
+ &link->work, LINK_TUNE_INTERVAL);
}
void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev)
@@ -469,8 +471,10 @@
* Increase tuner counter, and reschedule the next link tuner run.
*/
link->count++;
- ieee80211_queue_delayed_work(rt2x00dev->hw,
- &link->work, LINK_TUNE_INTERVAL);
+
+ if(test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
+ ieee80211_queue_delayed_work(rt2x00dev->hw,
+ &link->work, LINK_TUNE_INTERVAL);
}
void rt2x00link_register(struct rt2x00_dev *rt2x00dev)
More information about the users
mailing list