]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/net/wireless/zd1211rw/zd_mac.c
zd1211rw: move set_rts_cts_work to bss_info_changed
[mirror_ubuntu-artful-kernel.git] / drivers / net / wireless / zd1211rw / zd_mac.c
index 6107304cb94c5e7050cda334d6eaa142218159d3..487ed33e951d668c26f2bf58ad93c577c458765b 100644 (file)
@@ -911,9 +911,13 @@ static int zd_op_config(struct ieee80211_hw *hw, u32 changed)
 static void zd_process_intr(struct work_struct *work)
 {
        u16 int_status;
+       unsigned long flags;
        struct zd_mac *mac = container_of(work, struct zd_mac, process_intr);
 
-       int_status = le16_to_cpu(*(__le16 *)(mac->intr_buffer+4));
+       spin_lock_irqsave(&mac->lock, flags);
+       int_status = le16_to_cpu(*(__le16 *)(mac->intr_buffer + 4));
+       spin_unlock_irqrestore(&mac->lock, flags);
+
        if (int_status & INT_CFG_NEXT_BCN)
                dev_dbg_f_limit(zd_mac_dev(mac), "INT_CFG_NEXT_BCN\n");
        else
@@ -923,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,
                                   struct netdev_hw_addr_list *mc_list)
 {
@@ -979,6 +958,7 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
        };
        struct zd_mac *mac = zd_hw_mac(hw);
        unsigned long flags;
+       int r;
 
        /* Only deal with supported flags */
        changed_flags &= SUPPORTED_FIF_FLAGS;
@@ -1000,11 +980,13 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
        mac->multicast_hash = hash;
        spin_unlock_irqrestore(&mac->lock, flags);
 
-       /* XXX: these can be called here now, can sleep now! */
-       queue_work(zd_workqueue, &mac->set_multicast_hash_work);
+       zd_chip_set_multicast_hash(&mac->chip, &hash);
 
-       if (changed_flags & FIF_CONTROL)
-               queue_work(zd_workqueue, &mac->set_rx_filter_work);
+       if (changed_flags & FIF_CONTROL) {
+               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
         * do BSSID filtering */
@@ -1016,20 +998,9 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
         * time. */
 }
 
-static void set_rts_cts_work(struct work_struct *work)
+static void set_rts_cts(struct zd_mac *mac, unsigned int short_preamble)
 {
-       struct zd_mac *mac =
-               container_of(work, struct zd_mac, set_rts_cts_work);
-       unsigned long flags;
-       unsigned int short_preamble;
-
        mutex_lock(&mac->chip.mutex);
-
-       spin_lock_irqsave(&mac->lock, flags);
-       mac->updating_rts_rate = 0;
-       short_preamble = mac->short_preamble;
-       spin_unlock_irqrestore(&mac->lock, flags);
-
        zd_chip_set_rts_cts_rate_locked(&mac->chip, short_preamble);
        mutex_unlock(&mac->chip.mutex);
 }
@@ -1040,7 +1011,6 @@ static void zd_op_bss_info_changed(struct ieee80211_hw *hw,
                                   u32 changes)
 {
        struct zd_mac *mac = zd_hw_mac(hw);
-       unsigned long flags;
        int associated;
 
        dev_dbg_f(zd_mac_dev(mac), "changes: %x\n", changes);
@@ -1078,15 +1048,11 @@ static void zd_op_bss_info_changed(struct ieee80211_hw *hw,
        /* TODO: do hardware bssid filtering */
 
        if (changes & BSS_CHANGED_ERP_PREAMBLE) {
-               spin_lock_irqsave(&mac->lock, flags);
+               spin_lock_irq(&mac->lock);
                mac->short_preamble = bss_conf->use_short_preamble;
-               if (!mac->updating_rts_rate) {
-                       mac->updating_rts_rate = 1;
-                       /* FIXME: should disable TX here, until work has
-                        * completed and RTS_CTS reg is updated */
-                       queue_work(zd_workqueue, &mac->set_rts_cts_work);
-               }
-               spin_unlock_irqrestore(&mac->lock, flags);
+               spin_unlock_irq(&mac->lock);
+
+               set_rts_cts(mac, bss_conf->use_short_preamble);
        }
 }
 
@@ -1160,9 +1126,6 @@ struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf)
 
        zd_chip_init(&mac->chip, hw, intf);
        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_rx_filter_work, set_rx_filter_handler);
        INIT_WORK(&mac->process_intr, zd_process_intr);
 
        SET_IEEE80211_DEV(hw, &intf->dev);