Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a299c6d5 authored by Felix Fietkau's avatar Felix Fietkau Committed by Johannes Berg
Browse files

mac80211/minstrel_ht: improve max_prob_rate selection



max_prob_rate should be selected to be very reliable, however limiting
it to single-stream on 3-stream devices is a bit much.
Allow max_prob_rate to use one stream less than the max_tp_rate.

Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent ed97a13c
Loading
Loading
Loading
Loading
+19 −8
Original line number Original line Diff line number Diff line
@@ -246,6 +246,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
	struct minstrel_rate_stats *mr;
	struct minstrel_rate_stats *mr;
	int cur_prob, cur_prob_tp, cur_tp, cur_tp2;
	int cur_prob, cur_prob_tp, cur_tp, cur_tp2;
	int group, i, index;
	int group, i, index;
	int prob_max_streams = 1;


	if (mi->ampdu_packets > 0) {
	if (mi->ampdu_packets > 0) {
		mi->avg_ampdu_len = minstrel_ewma(mi->avg_ampdu_len,
		mi->avg_ampdu_len = minstrel_ewma(mi->avg_ampdu_len,
@@ -323,20 +324,13 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
		if (!mg->supported)
		if (!mg->supported)
			continue;
			continue;


		mr = minstrel_get_ratestats(mi, mg->max_prob_rate);
		if (cur_prob_tp < mr->cur_tp &&
		    minstrel_mcs_groups[group].streams == 1) {
			mi->max_prob_rate = mg->max_prob_rate;
			cur_prob = mr->cur_prob;
			cur_prob_tp = mr->cur_tp;
		}

		mr = minstrel_get_ratestats(mi, mg->max_tp_rate);
		mr = minstrel_get_ratestats(mi, mg->max_tp_rate);
		if (cur_tp < mr->cur_tp) {
		if (cur_tp < mr->cur_tp) {
			mi->max_tp_rate2 = mi->max_tp_rate;
			mi->max_tp_rate2 = mi->max_tp_rate;
			cur_tp2 = cur_tp;
			cur_tp2 = cur_tp;
			mi->max_tp_rate = mg->max_tp_rate;
			mi->max_tp_rate = mg->max_tp_rate;
			cur_tp = mr->cur_tp;
			cur_tp = mr->cur_tp;
			prob_max_streams = minstrel_mcs_groups[group].streams - 1;
		}
		}


		mr = minstrel_get_ratestats(mi, mg->max_tp_rate2);
		mr = minstrel_get_ratestats(mi, mg->max_tp_rate2);
@@ -346,6 +340,23 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
		}
		}
	}
	}


	if (prob_max_streams < 1)
		prob_max_streams = 1;

	for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
		mg = &mi->groups[group];
		if (!mg->supported)
			continue;
		mr = minstrel_get_ratestats(mi, mg->max_prob_rate);
		if (cur_prob_tp < mr->cur_tp &&
		    minstrel_mcs_groups[group].streams <= prob_max_streams) {
			mi->max_prob_rate = mg->max_prob_rate;
			cur_prob = mr->cur_prob;
			cur_prob_tp = mr->cur_tp;
		}
	}


	mi->stats_update = jiffies;
	mi->stats_update = jiffies;
}
}