[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