]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mac80211: add an option for station management TXQ
authorSara Sharon <sara.sharon@intel.com>
Wed, 5 Sep 2018 05:06:09 +0000 (08:06 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 5 Sep 2018 08:10:11 +0000 (10:10 +0200)
We have a TXQ abstraction for non-data packets that need
powersave buffering. Since the AP cannot sleep, in case
of station we can use this TXQ for all management frames,
regardless if they are bufferable. Add HW flag to allow
that.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/debugfs.c
net/mac80211/tx.c

index 50bf598abdfd8670ec91dc8ff6527ceac31c5dab..fe71cec8ba42a83df04233df720a2ec00370276f 100644 (file)
@@ -2152,6 +2152,10 @@ struct ieee80211_txq {
  *     but if the rate control is built-in then it must be set by the driver.
  *     See also the documentation for that flag.
  *
+ * @IEEE80211_HW_STA_MMPDU_TXQ: use the extra non-TID per-station TXQ for all
+ *     MMPDUs on station interfaces. This of course requires the driver to use
+ *     TXQs to start with.
+ *
  * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
  */
 enum ieee80211_hw_flags {
@@ -2199,6 +2203,7 @@ enum ieee80211_hw_flags {
        IEEE80211_HW_DOESNT_SUPPORT_QOS_NDP,
        IEEE80211_HW_BUFF_MMPDU_TXQ,
        IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW,
+       IEEE80211_HW_STA_MMPDU_TXQ,
 
        /* keep last, obviously */
        NUM_IEEE80211_HW_FLAGS
index fb45eb5d1dc47a8b7f2586e435b9e06965973f83..3fe541e358f3c16815ca0896638bd4093235b4f5 100644 (file)
@@ -217,6 +217,7 @@ static const char *hw_flag_names[] = {
        FLAG(DOESNT_SUPPORT_QOS_NDP),
        FLAG(BUFF_MMPDU_TXQ),
        FLAG(SUPPORTS_VHT_EXT_NSS_BW),
+       FLAG(STA_MMPDU_TXQ),
 #undef FLAG
 };
 
index e88547842239c9fc8d293ce0c7dc08a22d773a1b..96b6c9b09bd2971aaeb4a472dc6b82b9ae280997 100644 (file)
@@ -1251,7 +1251,8 @@ static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local,
 
        if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) {
                if ((!ieee80211_is_mgmt(hdr->frame_control) ||
-                    ieee80211_is_bufferable_mmpdu(hdr->frame_control)) &&
+                    ieee80211_is_bufferable_mmpdu(hdr->frame_control) ||
+                    vif->type == NL80211_IFTYPE_STATION) &&
                    sta && sta->uploaded) {
                        /*
                         * This will be NULL if the driver didn't set the
@@ -1456,9 +1457,16 @@ void ieee80211_txq_init(struct ieee80211_sub_if_data *sdata,
        }
 
        if (tid == IEEE80211_NUM_TIDS) {
-               /* Drivers need to opt in to the bufferable MMPDU TXQ */
-               if (!ieee80211_hw_check(&sdata->local->hw, BUFF_MMPDU_TXQ))
+               if (sdata->vif.type == NL80211_IFTYPE_STATION) {
+                       /* Drivers need to opt in to the management MPDU TXQ */
+                       if (!ieee80211_hw_check(&sdata->local->hw,
+                                               STA_MMPDU_TXQ))
+                               return;
+               } else if (!ieee80211_hw_check(&sdata->local->hw,
+                                              BUFF_MMPDU_TXQ)) {
+                       /* Drivers need to opt in to the bufferable MMPDU TXQ */
                        return;
+               }
                txqi->txq.ac = IEEE80211_AC_VO;
        } else {
                txqi->txq.ac = ieee80211_ac_from_tid(tid);