Merge branch 'akpm' (patches from Andrew)
[linux-2.6-microblaze.git] / net / mac80211 / main.c
index f33a3ac..05f4c3c 100644 (file)
@@ -257,14 +257,13 @@ static void ieee80211_restart_work(struct work_struct *work)
        /* wait for scan work complete */
        flush_workqueue(local->workqueue);
        flush_work(&local->sched_scan_stopped_work);
+       flush_work(&local->radar_detected_work);
+
+       rtnl_lock();
 
        WARN(test_bit(SCAN_HW_SCANNING, &local->scanning),
             "%s called with hardware scan in progress\n", __func__);
 
-       flush_work(&local->radar_detected_work);
-       /* we might do interface manipulations, so need both */
-       rtnl_lock();
-       wiphy_lock(local->hw.wiphy);
        list_for_each_entry(sdata, &local->interfaces, list) {
                /*
                 * XXX: there may be more work for other vif types and even
@@ -706,10 +705,13 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
        spin_lock_init(&local->queue_stop_reason_lock);
 
        for (i = 0; i < IEEE80211_NUM_ACS; i++) {
-               INIT_LIST_HEAD(&local->active_txqs[i]);
-               spin_lock_init(&local->active_txq_lock[i]);
-               local->aql_txq_limit_low[i] = IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L;
-               local->aql_txq_limit_high[i] =
+               struct airtime_sched_info *air_sched = &local->airtime[i];
+
+               air_sched->active_txqs = RB_ROOT_CACHED;
+               INIT_LIST_HEAD(&air_sched->active_list);
+               spin_lock_init(&air_sched->lock);
+               air_sched->aql_txq_limit_low = IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L;
+               air_sched->aql_txq_limit_high =
                        IEEE80211_DEFAULT_AQL_TXQ_LIMIT_H;
        }
 
@@ -739,8 +741,6 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
        INIT_WORK(&local->sched_scan_stopped_work,
                  ieee80211_sched_scan_stopped_work);
 
-       INIT_WORK(&local->tdls_chsw_work, ieee80211_tdls_chsw_work);
-
        spin_lock_init(&local->ack_status_lock);
        idr_init(&local->ack_status_frames);
 
@@ -757,7 +757,6 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
 
        skb_queue_head_init(&local->skb_queue);
        skb_queue_head_init(&local->skb_queue_unreliable);
-       skb_queue_head_init(&local->skb_queue_tdls_chsw);
 
        ieee80211_alloc_led_names(local);
 
@@ -1014,8 +1013,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
                supp_ht = supp_ht || sband->ht_cap.ht_supported;
                supp_vht = supp_vht || sband->vht_cap.vht_supported;
 
-               if (!supp_he)
-                       supp_he = !!ieee80211_get_he_sta_cap(sband);
+               for (i = 0; i < sband->n_iftype_data; i++) {
+                       const struct ieee80211_sband_iftype_data *iftd;
+
+                       iftd = &sband->iftype_data[i];
+
+                       supp_he = supp_he || (iftd && iftd->he_cap.has_he);
+               }
 
                /* HT, VHT, HE require QoS, thus >= 4 queues */
                if (WARN_ON(local->hw.queues < IEEE80211_NUM_ACS &&
@@ -1389,7 +1393,6 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)
        cancel_delayed_work_sync(&local->roc_work);
        cancel_work_sync(&local->restart_work);
        cancel_work_sync(&local->reconfig_filter);
-       cancel_work_sync(&local->tdls_chsw_work);
        flush_work(&local->sched_scan_stopped_work);
        flush_work(&local->radar_detected_work);
 
@@ -1401,7 +1404,6 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)
                wiphy_warn(local->hw.wiphy, "skb_queue not empty\n");
        skb_queue_purge(&local->skb_queue);
        skb_queue_purge(&local->skb_queue_unreliable);
-       skb_queue_purge(&local->skb_queue_tdls_chsw);
 
        wiphy_unregister(local->hw.wiphy);
        destroy_workqueue(local->workqueue);