mac80211: allow configure_filter callback to sleep
[pandora-kernel.git] / drivers / net / wireless / at76c50x-usb.c
index 4efbdbe..a6e1954 100644 (file)
@@ -1568,7 +1568,8 @@ static void at76_rx_tasklet(unsigned long param)
 
        at76_dbg(DBG_MAC80211, "calling ieee80211_rx_irqsafe(): %d/%d",
                 priv->rx_skb->len, priv->rx_skb->data_len);
-       ieee80211_rx_irqsafe(priv->hw, priv->rx_skb, &rx_status);
+       memcpy(IEEE80211_SKB_RXCB(priv->rx_skb), &rx_status, sizeof(rx_status));
+       ieee80211_rx_irqsafe(priv->hw, priv->rx_skb);
 
        /* Use a new skb for the next receive */
        priv->rx_skb = NULL;
@@ -1772,6 +1773,9 @@ static void at76_mac80211_stop(struct ieee80211_hw *hw)
 
        at76_dbg(DBG_MAC80211, "%s()", __func__);
 
+       cancel_delayed_work(&priv->dwork_hw_scan);
+       cancel_work_sync(&priv->work_set_promisc);
+
        mutex_lock(&priv->mtx);
 
        if (!priv->device_unplugged) {
@@ -1871,8 +1875,8 @@ static void at76_dwork_hw_scan(struct work_struct *work)
        /* FIXME: add maximum time for scan to complete */
 
        if (ret != CMD_STATUS_COMPLETE) {
-               queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
-                                  SCAN_POLL_INTERVAL);
+               ieee80211_queue_delayed_work(priv->hw, &priv->dwork_hw_scan,
+                                            SCAN_POLL_INTERVAL);
                mutex_unlock(&priv->mtx);
                return;
        }
@@ -1933,8 +1937,8 @@ static int at76_hw_scan(struct ieee80211_hw *hw,
                goto exit;
        }
 
-       queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
-                          SCAN_POLL_INTERVAL);
+       ieee80211_queue_delayed_work(priv->hw, &priv->dwork_hw_scan,
+                                    SCAN_POLL_INTERVAL);
 
 exit:
        mutex_unlock(&priv->mtx);
@@ -1993,15 +1997,14 @@ static void at76_bss_info_changed(struct ieee80211_hw *hw,
 /* must be atomic */
 static void at76_configure_filter(struct ieee80211_hw *hw,
                                  unsigned int changed_flags,
-                                 unsigned int *total_flags, int mc_count,
-                                 struct dev_addr_list *mc_list)
+                                 unsigned int *total_flags, u64 multicast)
 {
        struct at76_priv *priv = hw->priv;
        int flags;
 
        at76_dbg(DBG_MAC80211, "%s(): changed_flags=0x%08x "
-                "total_flags=0x%08x mc_count=%d",
-                __func__, changed_flags, *total_flags, mc_count);
+                "total_flags=0x%08x",
+                __func__, changed_flags, *total_flags);
 
        flags = changed_flags & AT76_SUPPORTED_FILTERS;
        *total_flags = AT76_SUPPORTED_FILTERS;
@@ -2023,7 +2026,7 @@ static void at76_configure_filter(struct ieee80211_hw *hw,
        } else
                return;
 
-       queue_work(hw->workqueue, &priv->work_set_promisc);
+       ieee80211_queue_work(hw, &priv->work_set_promisc);
 }
 
 static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
@@ -2294,11 +2297,8 @@ static void at76_delete_device(struct at76_priv *priv)
 
        tasklet_kill(&priv->rx_tasklet);
 
-       if (priv->mac80211_registered) {
-               cancel_delayed_work(&priv->dwork_hw_scan);
-               flush_workqueue(priv->hw->workqueue);
+       if (priv->mac80211_registered)
                ieee80211_unregister_hw(priv->hw);
-       }
 
        if (priv->tx_urb) {
                usb_kill_urb(priv->tx_urb);