mac80211: use multi-queue master netdevice
[deliverable/linux.git] / net / mac80211 / main.c
index 8f1ff7ef16672345a8bbd3ee188dda71cba303e5..97d4a537ca2fb079ecc2c87b29810bed5c5be7a5 100644 (file)
@@ -1634,12 +1634,32 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        if (result < 0)
                return result;
 
+       /*
+        * We use the number of queues for feature tests (QoS, HT) internally
+        * so restrict them appropriately.
+        */
+#ifdef CONFIG_MAC80211_QOS
+       if (hw->queues > IEEE80211_MAX_QUEUES)
+               hw->queues = IEEE80211_MAX_QUEUES;
+       if (hw->ampdu_queues > IEEE80211_MAX_AMPDU_QUEUES)
+               hw->ampdu_queues = IEEE80211_MAX_AMPDU_QUEUES;
+       if (hw->queues < 4)
+               hw->ampdu_queues = 0;
+#else
+       hw->queues = 1;
+       hw->ampdu_queues = 0;
+#endif
+
        /* for now, mdev needs sub_if_data :/ */
-       mdev = alloc_netdev(sizeof(struct ieee80211_sub_if_data),
-                           "wmaster%d", ether_setup);
+       mdev = alloc_netdev_mq(sizeof(struct ieee80211_sub_if_data),
+                              "wmaster%d", ether_setup,
+                              ieee80211_num_queues(hw));
        if (!mdev)
                goto fail_mdev_alloc;
 
+       if (ieee80211_num_queues(hw) > 1)
+               mdev->features |= NETIF_F_MULTI_QUEUE;
+
        sdata = IEEE80211_DEV_TO_SUB_IF(mdev);
        mdev->ieee80211_ptr = &sdata->wdev;
        sdata->wdev.wiphy = local->hw.wiphy;
@@ -1728,11 +1748,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
                goto fail_wep;
        }
 
-       if (hw->queues > IEEE80211_MAX_QUEUES)
-               hw->queues = IEEE80211_MAX_QUEUES;
-       if (hw->ampdu_queues > IEEE80211_MAX_AMPDU_QUEUES)
-               hw->ampdu_queues = IEEE80211_MAX_AMPDU_QUEUES;
-
        ieee80211_install_qdisc(local->mdev);
 
        /* add one default STA interface */
This page took 0.032257 seconds and 5 git commands to generate.