diff options
author | Karl Beldan <karl.beldan@rivierawaves.com> | 2013-04-18 08:26:20 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-04-22 09:47:12 -0400 |
commit | c2eb5b0f342c9b1c2e1d77680af71940fc997779 (patch) | |
tree | 7b20a5bb7ef8d0f2d2555662bd110dd978cfa39a /net/mac80211 | |
parent | 06f95e66deca680ff73076914b6ee47bcbe94926 (diff) |
mac80211: minstrel_ht: pick only supported rates for sta and group max*rates
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>
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/rc80211_minstrel_ht.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c index d2b264d1311d..a23a5cff0af5 100644 --- a/net/mac80211/rc80211_minstrel_ht.c +++ b/net/mac80211/rc80211_minstrel_ht.c | |||
@@ -244,6 +244,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) | |||
244 | struct minstrel_rate_stats *mr; | 244 | struct minstrel_rate_stats *mr; |
245 | int cur_prob, cur_prob_tp, cur_tp, cur_tp2; | 245 | int cur_prob, cur_prob_tp, cur_tp, cur_tp2; |
246 | int group, i, index; | 246 | int group, i, index; |
247 | bool mi_rates_valid = false; | ||
247 | 248 | ||
248 | if (mi->ampdu_packets > 0) { | 249 | if (mi->ampdu_packets > 0) { |
249 | mi->avg_ampdu_len = minstrel_ewma(mi->avg_ampdu_len, | 250 | 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) | |||
254 | 255 | ||
255 | mi->sample_slow = 0; | 256 | mi->sample_slow = 0; |
256 | mi->sample_count = 0; | 257 | mi->sample_count = 0; |
257 | mi->max_tp_rate = 0; | ||
258 | mi->max_tp_rate2 = 0; | ||
259 | mi->max_prob_rate = 0; | ||
260 | 258 | ||
261 | for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { | 259 | for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { |
260 | bool mg_rates_valid = false; | ||
261 | |||
262 | cur_prob = 0; | 262 | cur_prob = 0; |
263 | cur_prob_tp = 0; | 263 | cur_prob_tp = 0; |
264 | cur_tp = 0; | 264 | cur_tp = 0; |
@@ -268,15 +268,24 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) | |||
268 | if (!mg->supported) | 268 | if (!mg->supported) |
269 | continue; | 269 | continue; |
270 | 270 | ||
271 | mg->max_tp_rate = 0; | ||
272 | mg->max_tp_rate2 = 0; | ||
273 | mg->max_prob_rate = 0; | ||
274 | mi->sample_count++; | 271 | mi->sample_count++; |
275 | 272 | ||
276 | for (i = 0; i < MCS_GROUP_RATES; i++) { | 273 | for (i = 0; i < MCS_GROUP_RATES; i++) { |
277 | if (!(mg->supported & BIT(i))) | 274 | if (!(mg->supported & BIT(i))) |
278 | continue; | 275 | continue; |
279 | 276 | ||
277 | /* initialize rates selections starting indexes */ | ||
278 | if (!mg_rates_valid) { | ||
279 | mg->max_tp_rate = mg->max_tp_rate2 = | ||
280 | mg->max_prob_rate = i; | ||
281 | if (!mi_rates_valid) { | ||
282 | mi->max_tp_rate = mi->max_tp_rate2 = | ||
283 | mi->max_prob_rate = i; | ||
284 | mi_rates_valid = true; | ||
285 | } | ||
286 | mg_rates_valid = true; | ||
287 | } | ||
288 | |||
280 | mr = &mg->rates[i]; | 289 | mr = &mg->rates[i]; |
281 | mr->retry_updated = false; | 290 | mr->retry_updated = false; |
282 | index = MCS_GROUP_RATES * group + i; | 291 | index = MCS_GROUP_RATES * group + i; |