mac80211: minstrel: Enable STBC and LDPC for VHT Rates
authorChaitanya T K <chaitanya.mgit@gmail.com>
Sat, 6 Oct 2018 17:34:59 +0000 (19:34 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 11 Oct 2018 14:01:00 +0000 (16:01 +0200)
If peer support reception of STBC and LDPC, enable them for better
performance.

Signed-off-by: Chaitanya TK <chaitanya.mgit@gmail.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/linux/ieee80211.h
net/mac80211/rc80211_minstrel_ht.c

index c4809ad8ab4666964aa901fdc15104263ab279e5..0ef67f837ae12de08fd8a39532d794463d579f82 100644 (file)
@@ -1670,6 +1670,7 @@ struct ieee80211_mu_edca_param_set {
 #define IEEE80211_VHT_CAP_RXSTBC_3                             0x00000300
 #define IEEE80211_VHT_CAP_RXSTBC_4                             0x00000400
 #define IEEE80211_VHT_CAP_RXSTBC_MASK                          0x00000700
+#define IEEE80211_VHT_CAP_RXSTBC_SHIFT                         8
 #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE                        0x00000800
 #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE                        0x00001000
 #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT                  13
index 67ebdeaffbbc8e6afbc5259988bf463f0c46abb9..16d1ac30978d6ed0252b5d6b0450b943691f737b 100644 (file)
@@ -1130,7 +1130,7 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
        struct minstrel_ht_sta_priv *msp = priv_sta;
        struct minstrel_ht_sta *mi = &msp->ht;
        struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
-       u16 sta_cap = sta->ht_cap.cap;
+       u16 ht_cap = sta->ht_cap.cap;
        struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
        struct sta_info *sinfo = container_of(sta, struct sta_info, sta);
        int use_vht;
@@ -1138,6 +1138,7 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
        int ack_dur;
        int stbc;
        int i;
+       bool ldpc;
 
        /* fall back to the old minstrel for legacy stations */
        if (!sta->ht_cap.ht_supported)
@@ -1175,16 +1176,22 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
        }
        mi->sample_tries = 4;
 
-       /* TODO tx_flags for vht - ATM the RC API is not fine-grained enough */
        if (!use_vht) {
-               stbc = (sta_cap & IEEE80211_HT_CAP_RX_STBC) >>
+               stbc = (ht_cap & IEEE80211_HT_CAP_RX_STBC) >>
                        IEEE80211_HT_CAP_RX_STBC_SHIFT;
-               mi->tx_flags |= stbc << IEEE80211_TX_CTL_STBC_SHIFT;
 
-               if (sta_cap & IEEE80211_HT_CAP_LDPC_CODING)
-                       mi->tx_flags |= IEEE80211_TX_CTL_LDPC;
+               ldpc = ht_cap & IEEE80211_HT_CAP_LDPC_CODING;
+       } else {
+               stbc = (vht_cap->cap & IEEE80211_VHT_CAP_RXSTBC_MASK) >>
+                       IEEE80211_VHT_CAP_RXSTBC_SHIFT;
+
+               ldpc = vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC;
        }
 
+       mi->tx_flags |= stbc << IEEE80211_TX_CTL_STBC_SHIFT;
+       if (ldpc)
+               mi->tx_flags |= IEEE80211_TX_CTL_LDPC;
+
        for (i = 0; i < ARRAY_SIZE(mi->groups); i++) {
                u32 gflags = minstrel_mcs_groups[i].flags;
                int bw, nss;
@@ -1197,10 +1204,10 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
 
                if (gflags & IEEE80211_TX_RC_SHORT_GI) {
                        if (gflags & IEEE80211_TX_RC_40_MHZ_WIDTH) {
-                               if (!(sta_cap & IEEE80211_HT_CAP_SGI_40))
+                               if (!(ht_cap & IEEE80211_HT_CAP_SGI_40))
                                        continue;
                        } else {
-                               if (!(sta_cap & IEEE80211_HT_CAP_SGI_20))
+                               if (!(ht_cap & IEEE80211_HT_CAP_SGI_20))
                                        continue;
                        }
                }