diff options
author | Felix Fietkau <nbd@nbd.name> | 2020-12-29 18:23:29 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2021-01-03 12:56:40 +0100 |
commit | 3a12c6679eb184ca2a9a2b1266cc2d41f3f00bad (patch) | |
tree | 4c2a02dad4c0ebd8cbd90ad751841f3cedbdfd05 /package/kernel/mac80211/patches/subsys/337-mac80211-minstrel_ht-clean-up-CCK-code.patch | |
parent | 55e23f2c02ae95e84613ed7d1cbf8aba557b8682 (diff) | |
download | upstream-3a12c6679eb184ca2a9a2b1266cc2d41f3f00bad.tar.gz upstream-3a12c6679eb184ca2a9a2b1266cc2d41f3f00bad.tar.bz2 upstream-3a12c6679eb184ca2a9a2b1266cc2d41f3f00bad.zip |
mac80211: replace legacy minstrel with minstrel_ht, improve rate selection
Legacy minstrel is essentially unmaintained and was showing poor performance
Replace it with minstrel_ht and improve rate selection and sampling behavior
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package/kernel/mac80211/patches/subsys/337-mac80211-minstrel_ht-clean-up-CCK-code.patch')
-rw-r--r-- | package/kernel/mac80211/patches/subsys/337-mac80211-minstrel_ht-clean-up-CCK-code.patch | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/subsys/337-mac80211-minstrel_ht-clean-up-CCK-code.patch b/package/kernel/mac80211/patches/subsys/337-mac80211-minstrel_ht-clean-up-CCK-code.patch new file mode 100644 index 0000000000..f667d2c94e --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/337-mac80211-minstrel_ht-clean-up-CCK-code.patch @@ -0,0 +1,166 @@ +From: Felix Fietkau <nbd@nbd.name> +Date: Fri, 25 Dec 2020 16:22:52 +0100 +Subject: [PATCH] mac80211: minstrel_ht: clean up CCK code + +- move ack overhead out of rate duration table +- remove cck_supported, cck_supported_short + +Preparation for adding OFDM legacy rates support + +Signed-off-by: Felix Fietkau <nbd@nbd.name> +--- + +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -136,20 +136,16 @@ + __VHT_GROUP(_streams, _sgi, _bw, \ + VHT_GROUP_SHIFT(_streams, _sgi, _bw)) + +-#define CCK_DURATION(_bitrate, _short, _len) \ ++#define CCK_DURATION(_bitrate, _short) \ + (1000 * (10 /* SIFS */ + \ + (_short ? 72 + 24 : 144 + 48) + \ +- (8 * (_len + 4) * 10) / (_bitrate))) +- +-#define CCK_ACK_DURATION(_bitrate, _short) \ +- (CCK_DURATION((_bitrate > 10 ? 20 : 10), false, 60) + \ +- CCK_DURATION(_bitrate, _short, AVG_PKT_SIZE)) ++ (8 * (AVG_PKT_SIZE + 4) * 10) / (_bitrate))) + + #define CCK_DURATION_LIST(_short, _s) \ +- CCK_ACK_DURATION(10, _short) >> _s, \ +- CCK_ACK_DURATION(20, _short) >> _s, \ +- CCK_ACK_DURATION(55, _short) >> _s, \ +- CCK_ACK_DURATION(110, _short) >> _s ++ CCK_DURATION(10, _short) >> _s, \ ++ CCK_DURATION(20, _short) >> _s, \ ++ CCK_DURATION(55, _short) >> _s, \ ++ CCK_DURATION(110, _short) >> _s + + #define __CCK_GROUP(_s) \ + [MINSTREL_CCK_GROUP] = { \ +@@ -163,7 +159,7 @@ + } + + #define CCK_GROUP_SHIFT \ +- GROUP_SHIFT(CCK_ACK_DURATION(10, false)) ++ GROUP_SHIFT(CCK_DURATION(10, false)) + + #define CCK_GROUP __CCK_GROUP(CCK_GROUP_SHIFT) + +@@ -349,15 +345,19 @@ int + minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate, + int prob_avg) + { +- unsigned int nsecs = 0; ++ unsigned int nsecs = 0, overhead = mi->overhead; ++ unsigned int ampdu_len = 1; + + /* do not account throughput if sucess prob is below 10% */ + if (prob_avg < MINSTREL_FRAC(10, 100)) + return 0; + +- if (group != MINSTREL_CCK_GROUP) +- nsecs = 1000 * mi->overhead / minstrel_ht_avg_ampdu_len(mi); ++ if (group == MINSTREL_CCK_GROUP) ++ overhead = mi->overhead_legacy; ++ else ++ ampdu_len = minstrel_ht_avg_ampdu_len(mi); + ++ nsecs = 1000 * overhead / ampdu_len; + nsecs += minstrel_mcs_groups[group].duration[rate] << + minstrel_mcs_groups[group].shift; + +@@ -1031,7 +1031,10 @@ minstrel_calc_retransmit(struct minstrel + ctime += (t_slot * cw) >> 1; + cw = min((cw << 1) | 1, mp->cw_max); + +- if (index / MCS_GROUP_RATES != MINSTREL_CCK_GROUP) { ++ if (index / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) { ++ overhead = mi->overhead_legacy; ++ overhead_rtscts = mi->overhead_legacy_rtscts; ++ } else { + overhead = mi->overhead; + overhead_rtscts = mi->overhead_rtscts; + } +@@ -1369,18 +1372,14 @@ minstrel_ht_update_cck(struct minstrel_p + if (!ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES)) + return; + +- mi->cck_supported = 0; +- mi->cck_supported_short = 0; + for (i = 0; i < 4; i++) { + if (!rate_supported(sta, sband->band, mp->cck_rates[i])) + continue; + +- mi->cck_supported |= BIT(i); ++ mi->supported[MINSTREL_CCK_GROUP] |= BIT(i); + if (sband->bitrates[i].flags & IEEE80211_RATE_SHORT_PREAMBLE) +- mi->cck_supported_short |= BIT(i); ++ mi->supported[MINSTREL_CCK_GROUP] |= BIT(i + 4); + } +- +- mi->supported[MINSTREL_CCK_GROUP] = mi->cck_supported; + } + + static void +@@ -1394,12 +1393,13 @@ minstrel_ht_update_caps(void *priv, stru + struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs; + u16 ht_cap = sta->ht_cap.cap; + struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap; ++ const struct ieee80211_rate *ctl_rate; ++ bool ldpc, erp; + int use_vht; + int n_supported = 0; + int ack_dur; + int stbc; + int i; +- bool ldpc; + + /* fall back to the old minstrel for legacy stations */ + if (!sta->ht_cap.ht_supported) +@@ -1423,6 +1423,14 @@ minstrel_ht_update_caps(void *priv, stru + mi->overhead += ack_dur; + mi->overhead_rtscts = mi->overhead + 2 * ack_dur; + ++ ctl_rate = &sband->bitrates[rate_lowest_index(sband, sta)]; ++ erp = ctl_rate->flags & IEEE80211_RATE_ERP_G; ++ ack_dur = ieee80211_frame_duration(sband->band, 10, ++ ctl_rate->bitrate, erp, 1, ++ ieee80211_chandef_get_shift(chandef)); ++ mi->overhead_legacy = ack_dur; ++ mi->overhead_legacy_rtscts = mi->overhead_legacy + 2 * ack_dur; ++ + mi->avg_ampdu_len = MINSTREL_FRAC(1, 1); + + /* When using MRR, sample more on the first attempt, without delay */ +@@ -1523,8 +1531,6 @@ minstrel_ht_update_caps(void *priv, stru + if (!n_supported) + goto use_legacy; + +- mi->supported[MINSTREL_CCK_GROUP] |= mi->cck_supported_short << 4; +- + /* create an initial rate table with the lowest supported rates */ + minstrel_ht_update_stats(mp, mi, true); + minstrel_ht_update_rates(mp, mi); +--- a/net/mac80211/rc80211_minstrel_ht.h ++++ b/net/mac80211/rc80211_minstrel_ht.h +@@ -77,6 +77,8 @@ struct minstrel_ht_sta { + /* overhead time in usec for each frame */ + unsigned int overhead; + unsigned int overhead_rtscts; ++ unsigned int overhead_legacy; ++ unsigned int overhead_legacy_rtscts; + + unsigned int total_packets_last; + unsigned int total_packets_cur; +@@ -97,9 +99,6 @@ struct minstrel_ht_sta { + /* current MCS group to be sampled */ + u8 sample_group; + +- u8 cck_supported; +- u8 cck_supported_short; +- + /* Bitfield of supported MCS rates of all groups */ + u16 supported[MINSTREL_GROUPS_NB]; + |