提交 a6fb071b 编写于 作者: J Jussi Kivilinna 提交者: John W. Linville

zd1211rw: move set_multicast_hash and set_rx_filter from workers to configure_filter

Workers not needed anymore since configure_filter may sleep. Keep
mac->multicast_hash for later use (hw reset).
Signed-off-by: NJussi Kivilinna <jussi.kivilina@mbnet.fi>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 88a1159a
...@@ -927,31 +927,6 @@ static void zd_process_intr(struct work_struct *work) ...@@ -927,31 +927,6 @@ static void zd_process_intr(struct work_struct *work)
} }
static void set_multicast_hash_handler(struct work_struct *work)
{
struct zd_mac *mac =
container_of(work, struct zd_mac, set_multicast_hash_work);
struct zd_mc_hash hash;
spin_lock_irq(&mac->lock);
hash = mac->multicast_hash;
spin_unlock_irq(&mac->lock);
zd_chip_set_multicast_hash(&mac->chip, &hash);
}
static void set_rx_filter_handler(struct work_struct *work)
{
struct zd_mac *mac =
container_of(work, struct zd_mac, set_rx_filter_work);
int r;
dev_dbg_f(zd_mac_dev(mac), "\n");
r = set_rx_filter(mac);
if (r)
dev_err(zd_mac_dev(mac), "set_rx_filter_handler error %d\n", r);
}
static u64 zd_op_prepare_multicast(struct ieee80211_hw *hw, static u64 zd_op_prepare_multicast(struct ieee80211_hw *hw,
struct netdev_hw_addr_list *mc_list) struct netdev_hw_addr_list *mc_list)
{ {
...@@ -983,6 +958,7 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw, ...@@ -983,6 +958,7 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
}; };
struct zd_mac *mac = zd_hw_mac(hw); struct zd_mac *mac = zd_hw_mac(hw);
unsigned long flags; unsigned long flags;
int r;
/* Only deal with supported flags */ /* Only deal with supported flags */
changed_flags &= SUPPORTED_FIF_FLAGS; changed_flags &= SUPPORTED_FIF_FLAGS;
...@@ -1004,11 +980,13 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw, ...@@ -1004,11 +980,13 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
mac->multicast_hash = hash; mac->multicast_hash = hash;
spin_unlock_irqrestore(&mac->lock, flags); spin_unlock_irqrestore(&mac->lock, flags);
/* XXX: these can be called here now, can sleep now! */ zd_chip_set_multicast_hash(&mac->chip, &hash);
queue_work(zd_workqueue, &mac->set_multicast_hash_work);
if (changed_flags & FIF_CONTROL) if (changed_flags & FIF_CONTROL) {
queue_work(zd_workqueue, &mac->set_rx_filter_work); r = set_rx_filter(mac);
if (r)
dev_err(zd_mac_dev(mac), "set_rx_filter error %d\n", r);
}
/* no handling required for FIF_OTHER_BSS as we don't currently /* no handling required for FIF_OTHER_BSS as we don't currently
* do BSSID filtering */ * do BSSID filtering */
...@@ -1164,9 +1142,7 @@ struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf) ...@@ -1164,9 +1142,7 @@ struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf)
zd_chip_init(&mac->chip, hw, intf); zd_chip_init(&mac->chip, hw, intf);
housekeeping_init(mac); housekeeping_init(mac);
INIT_WORK(&mac->set_multicast_hash_work, set_multicast_hash_handler);
INIT_WORK(&mac->set_rts_cts_work, set_rts_cts_work); INIT_WORK(&mac->set_rts_cts_work, set_rts_cts_work);
INIT_WORK(&mac->set_rx_filter_work, set_rx_filter_handler);
INIT_WORK(&mac->process_intr, zd_process_intr); INIT_WORK(&mac->process_intr, zd_process_intr);
SET_IEEE80211_DEV(hw, &intf->dev); SET_IEEE80211_DEV(hw, &intf->dev);
......
...@@ -173,9 +173,7 @@ struct zd_mac { ...@@ -173,9 +173,7 @@ struct zd_mac {
spinlock_t intr_lock; spinlock_t intr_lock;
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
struct housekeeping housekeeping; struct housekeeping housekeeping;
struct work_struct set_multicast_hash_work;
struct work_struct set_rts_cts_work; struct work_struct set_rts_cts_work;
struct work_struct set_rx_filter_work;
struct work_struct process_intr; struct work_struct process_intr;
struct zd_mc_hash multicast_hash; struct zd_mc_hash multicast_hash;
u8 intr_buffer[USB_MAX_EP_INT_BUFFER]; u8 intr_buffer[USB_MAX_EP_INT_BUFFER];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册