rt2x00: configure_filter() callback is allowed to sleep
authorIvo van Doorn <ivdoorn@gmail.com>
Tue, 18 Aug 2009 17:54:23 +0000 (19:54 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 20 Aug 2009 15:36:05 +0000 (11:36 -0400)
The configure_filter() callback function no longer needs
to be atomic. Remove the scheduled work structure and
call into the driver configure_filter() directly.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00mac.c

index 39d7d9baafdd54a174adf75a785c14693e887585..ad70946c3b5f5a2dfc62c848b655a8161fbe55c3 100644 (file)
@@ -826,7 +826,6 @@ struct rt2x00_dev {
         * due to RTNL locking requirements.
         */
        struct work_struct intf_work;
-       struct work_struct filter_work;
 
        /*
         * Data queue arrays for RX, TX and Beacon.
index 9ab70e435b5d1b1211642a60601c9a57b25e6205..16b560a661e3a39904fca85a088819a867b3fd2c 100644 (file)
@@ -118,14 +118,6 @@ void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state)
                rt2x00link_start_tuner(rt2x00dev);
 }
 
-static void rt2x00lib_packetfilter_scheduled(struct work_struct *work)
-{
-       struct rt2x00_dev *rt2x00dev =
-           container_of(work, struct rt2x00_dev, filter_work);
-
-       rt2x00dev->ops->lib->config_filter(rt2x00dev, rt2x00dev->packet_filter);
-}
-
 static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac,
                                          struct ieee80211_vif *vif)
 {
@@ -859,7 +851,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
         * Initialize configuration work.
         */
        INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled);
-       INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled);
 
        /*
         * Allocate queue array.
@@ -907,7 +898,6 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
        /*
         * Stop all work.
         */
-       cancel_work_sync(&rt2x00dev->filter_work);
        cancel_work_sync(&rt2x00dev->intf_work);
 
        /*
index 3011aea4feadd4e807865092db66901c5848c4ee..967d3b55c89723f291c0b244f12ca477a9129ad7 100644 (file)
@@ -430,10 +430,7 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
                return;
        rt2x00dev->packet_filter = *total_flags;
 
-       if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags))
-               rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags);
-       else
-               ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->filter_work);
+       rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags);
 }
 EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter);