| 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]; |
| |