mac80211: minstrel_ht: pick only supported rates for sta and group max*rates
authorKarl Beldan <karl.beldan@rivierawaves.com>
Thu, 18 Apr 2013 12:26:20 +0000 (14:26 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 22 Apr 2013 13:47:12 +0000 (15:47 +0200)
minstrel_ht initializes max_tp_rate max_tp_rate2 and max_prob_rate to
zero both for minstrel_ht_sta and minstrel_mcs_group_data.
This is wrong since there is no guarantee that the 1st rate of any
group is supported.

Signed-off-by: Karl Beldan <karl.beldan@rivierawaves.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/rc80211_minstrel_ht.c

index d2b264d1311d25a337fc267b69f931b996e8e07a..a23a5cff0af54760cbd9cc51e249e966c1073389 100644 (file)
@@ -244,6 +244,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
        struct minstrel_rate_stats *mr;
        int cur_prob, cur_prob_tp, cur_tp, cur_tp2;
        int group, i, index;
+       bool mi_rates_valid = false;
 
        if (mi->ampdu_packets > 0) {
                mi->avg_ampdu_len = minstrel_ewma(mi->avg_ampdu_len,
@@ -254,11 +255,10 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
 
        mi->sample_slow = 0;
        mi->sample_count = 0;
-       mi->max_tp_rate = 0;
-       mi->max_tp_rate2 = 0;
-       mi->max_prob_rate = 0;
 
        for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
+               bool mg_rates_valid = false;
+
                cur_prob = 0;
                cur_prob_tp = 0;
                cur_tp = 0;
@@ -268,15 +268,24 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
                if (!mg->supported)
                        continue;
 
-               mg->max_tp_rate = 0;
-               mg->max_tp_rate2 = 0;
-               mg->max_prob_rate = 0;
                mi->sample_count++;
 
                for (i = 0; i < MCS_GROUP_RATES; i++) {
                        if (!(mg->supported & BIT(i)))
                                continue;
 
+                       /* initialize rates selections starting indexes */
+                       if (!mg_rates_valid) {
+                               mg->max_tp_rate = mg->max_tp_rate2 =
+                                       mg->max_prob_rate = i;
+                               if (!mi_rates_valid) {
+                                       mi->max_tp_rate = mi->max_tp_rate2 =
+                                               mi->max_prob_rate = i;
+                                       mi_rates_valid = true;
+                               }
+                               mg_rates_valid = true;
+                       }
+
                        mr = &mg->rates[i];
                        mr->retry_updated = false;
                        index = MCS_GROUP_RATES * group + i;