forked from Minki/linux
rt2x00: configure_filter() callback is allowed to sleep
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>
This commit is contained in:
parent
ad002395fd
commit
afa620429a
@ -826,7 +826,6 @@ struct rt2x00_dev {
|
|||||||
* due to RTNL locking requirements.
|
* due to RTNL locking requirements.
|
||||||
*/
|
*/
|
||||||
struct work_struct intf_work;
|
struct work_struct intf_work;
|
||||||
struct work_struct filter_work;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data queue arrays for RX, TX and Beacon.
|
* Data queue arrays for RX, TX and Beacon.
|
||||||
|
@ -118,14 +118,6 @@ void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
|||||||
rt2x00link_start_tuner(rt2x00dev);
|
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,
|
static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac,
|
||||||
struct ieee80211_vif *vif)
|
struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
@ -859,7 +851,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
|||||||
* Initialize configuration work.
|
* Initialize configuration work.
|
||||||
*/
|
*/
|
||||||
INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled);
|
INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled);
|
||||||
INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate queue array.
|
* Allocate queue array.
|
||||||
@ -907,7 +898,6 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
|
|||||||
/*
|
/*
|
||||||
* Stop all work.
|
* Stop all work.
|
||||||
*/
|
*/
|
||||||
cancel_work_sync(&rt2x00dev->filter_work);
|
|
||||||
cancel_work_sync(&rt2x00dev->intf_work);
|
cancel_work_sync(&rt2x00dev->intf_work);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -430,10 +430,7 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
|
|||||||
return;
|
return;
|
||||||
rt2x00dev->packet_filter = *total_flags;
|
rt2x00dev->packet_filter = *total_flags;
|
||||||
|
|
||||||
if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags))
|
rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags);
|
||||||
rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags);
|
|
||||||
else
|
|
||||||
ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->filter_work);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter);
|
EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user