]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/mac80211/rc80211_minstrel_ht.c
Merge tag 'mac80211-next-for-davem-2017-01-13' of git://git.kernel.org/pub/scm/linux...
[karo-tx-linux.git] / net / mac80211 / rc80211_minstrel_ht.c
index 30fbabf4bcbc16aeb93e9c673d190cd3b615988b..8e783e197e935cd8bcd0b7b7d5e88b8d2c9210cc 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/ieee80211.h>
 #include <net/mac80211.h>
 #include "rate.h"
+#include "sta_info.h"
 #include "rc80211_minstrel.h"
 #include "rc80211_minstrel_ht.h"
 
@@ -154,67 +155,47 @@ MODULE_PARM_DESC(minstrel_vht_only,
 const struct mcs_group minstrel_mcs_groups[] = {
        MCS_GROUP(1, 0, BW_20),
        MCS_GROUP(2, 0, BW_20),
-#if MINSTREL_MAX_STREAMS >= 3
        MCS_GROUP(3, 0, BW_20),
-#endif
 
        MCS_GROUP(1, 1, BW_20),
        MCS_GROUP(2, 1, BW_20),
-#if MINSTREL_MAX_STREAMS >= 3
        MCS_GROUP(3, 1, BW_20),
-#endif
 
        MCS_GROUP(1, 0, BW_40),
        MCS_GROUP(2, 0, BW_40),
-#if MINSTREL_MAX_STREAMS >= 3
        MCS_GROUP(3, 0, BW_40),
-#endif
 
        MCS_GROUP(1, 1, BW_40),
        MCS_GROUP(2, 1, BW_40),
-#if MINSTREL_MAX_STREAMS >= 3
        MCS_GROUP(3, 1, BW_40),
-#endif
 
        CCK_GROUP,
 
 #ifdef CONFIG_MAC80211_RC_MINSTREL_VHT
        VHT_GROUP(1, 0, BW_20),
        VHT_GROUP(2, 0, BW_20),
-#if MINSTREL_MAX_STREAMS >= 3
        VHT_GROUP(3, 0, BW_20),
-#endif
 
        VHT_GROUP(1, 1, BW_20),
        VHT_GROUP(2, 1, BW_20),
-#if MINSTREL_MAX_STREAMS >= 3
        VHT_GROUP(3, 1, BW_20),
-#endif
 
        VHT_GROUP(1, 0, BW_40),
        VHT_GROUP(2, 0, BW_40),
-#if MINSTREL_MAX_STREAMS >= 3
        VHT_GROUP(3, 0, BW_40),
-#endif
 
        VHT_GROUP(1, 1, BW_40),
        VHT_GROUP(2, 1, BW_40),
-#if MINSTREL_MAX_STREAMS >= 3
        VHT_GROUP(3, 1, BW_40),
-#endif
 
        VHT_GROUP(1, 0, BW_80),
        VHT_GROUP(2, 0, BW_80),
-#if MINSTREL_MAX_STREAMS >= 3
        VHT_GROUP(3, 0, BW_80),
-#endif
 
        VHT_GROUP(1, 1, BW_80),
        VHT_GROUP(2, 1, BW_80),
-#if MINSTREL_MAX_STREAMS >= 3
        VHT_GROUP(3, 1, BW_80),
 #endif
-#endif
 };
 
 static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES] __read_mostly;
@@ -301,7 +282,7 @@ minstrel_ht_get_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
                                break;
 
                /* short preamble */
-               if (!(mi->groups[group].supported & BIT(idx)))
+               if (!(mi->supported[group] & BIT(idx)))
                        idx += 4;
        }
        return &mi->groups[group].rates[idx];
@@ -486,7 +467,7 @@ minstrel_ht_prob_rate_reduce_streams(struct minstrel_ht_sta *mi)
                          MCS_GROUP_RATES].streams;
        for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
                mg = &mi->groups[group];
-               if (!mg->supported || group == MINSTREL_CCK_GROUP)
+               if (!mi->supported[group] || group == MINSTREL_CCK_GROUP)
                        continue;
 
                tmp_idx = mg->max_group_prob_rate % MCS_GROUP_RATES;
@@ -540,7 +521,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
        for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
 
                mg = &mi->groups[group];
-               if (!mg->supported)
+               if (!mi->supported[group])
                        continue;
 
                mi->sample_count++;
@@ -550,7 +531,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
                        tmp_group_tp_rate[j] = group;
 
                for (i = 0; i < MCS_GROUP_RATES; i++) {
-                       if (!(mg->supported & BIT(i)))
+                       if (!(mi->supported[group] & BIT(i)))
                                continue;
 
                        index = MCS_GROUP_RATES * group + i;
@@ -636,7 +617,7 @@ minstrel_set_next_sample_idx(struct minstrel_ht_sta *mi)
                mi->sample_group %= ARRAY_SIZE(minstrel_mcs_groups);
                mg = &mi->groups[mi->sample_group];
 
-               if (!mg->supported)
+               if (!mi->supported[mi->sample_group])
                        continue;
 
                if (++mg->index >= MCS_GROUP_RATES) {
@@ -657,7 +638,7 @@ minstrel_downgrade_rate(struct minstrel_ht_sta *mi, u16 *idx, bool primary)
        while (group > 0) {
                group--;
 
-               if (!mi->groups[group].supported)
+               if (!mi->supported[group])
                        continue;
 
                if (minstrel_mcs_groups[group].streams >
@@ -994,7 +975,7 @@ minstrel_get_sample_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
        sample_idx = sample_table[mg->column][mg->index];
        minstrel_set_next_sample_idx(mi);
 
-       if (!(mg->supported & BIT(sample_idx)))
+       if (!(mi->supported[sample_group] & BIT(sample_idx)))
                return -1;
 
        mrs = &mg->rates[sample_idx];
@@ -1048,22 +1029,6 @@ minstrel_get_sample_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
        return sample_idx;
 }
 
-static void
-minstrel_ht_check_cck_shortpreamble(struct minstrel_priv *mp,
-                                   struct minstrel_ht_sta *mi, bool val)
-{
-       u8 supported = mi->groups[MINSTREL_CCK_GROUP].supported;
-
-       if (!supported || !mi->cck_supported_short)
-               return;
-
-       if (supported & (mi->cck_supported_short << (val * 4)))
-               return;
-
-       supported ^= mi->cck_supported_short | (mi->cck_supported_short << 4);
-       mi->groups[MINSTREL_CCK_GROUP].supported = supported;
-}
-
 static void
 minstrel_ht_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
                      struct ieee80211_tx_rate_control *txrc)
@@ -1087,7 +1052,6 @@ minstrel_ht_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
                minstrel_aggr_check(sta, txrc->skb);
 
        info->flags |= mi->tx_flags;
-       minstrel_ht_check_cck_shortpreamble(mp, mi, txrc->short_preamble);
 
 #ifdef CONFIG_MAC80211_DEBUGFS
        if (mp->fixed_rate_idx != -1)
@@ -1154,7 +1118,7 @@ minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
                        mi->cck_supported_short |= BIT(i);
        }
 
-       mi->groups[MINSTREL_CCK_GROUP].supported = mi->cck_supported;
+       mi->supported[MINSTREL_CCK_GROUP] = mi->cck_supported;
 }
 
 static void
@@ -1168,6 +1132,7 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
        struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
        u16 sta_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;
        int n_supported = 0;
        int ack_dur;
@@ -1224,7 +1189,7 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
                u32 gflags = minstrel_mcs_groups[i].flags;
                int bw, nss;
 
-               mi->groups[i].supported = 0;
+               mi->supported[i] = 0;
                if (i == MINSTREL_CCK_GROUP) {
                        minstrel_ht_update_cck(mp, mi, sband, sta);
                        continue;
@@ -1256,8 +1221,8 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
                        if (use_vht && minstrel_vht_only)
                                continue;
 #endif
-                       mi->groups[i].supported = mcs->rx_mask[nss - 1];
-                       if (mi->groups[i].supported)
+                       mi->supported[i] = mcs->rx_mask[nss - 1];
+                       if (mi->supported[i])
                                n_supported++;
                        continue;
                }
@@ -1283,16 +1248,19 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
                else
                        bw = BW_20;
 
-               mi->groups[i].supported = minstrel_get_valid_vht_rates(bw, nss,
+               mi->supported[i] = minstrel_get_valid_vht_rates(bw, nss,
                                vht_cap->vht_mcs.tx_mcs_map);
 
-               if (mi->groups[i].supported)
+               if (mi->supported[i])
                        n_supported++;
        }
 
        if (!n_supported)
                goto use_legacy;
 
+       if (test_sta_flag(sinfo, WLAN_STA_SHORT_PREAMBLE))
+               mi->cck_supported_short |= mi->cck_supported_short << 4;
+
        /* create an initial rate table with the lowest supported rates */
        minstrel_ht_update_stats(mp, mi);
        minstrel_ht_update_rates(mp, mi);