Commit f84de063 authored by Felix Fietkau's avatar Felix Fietkau Committed by Johannes Berg

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: default avatarFelix Fietkau <nbd@nbd.name>
Link: https://lore.kernel.org/r/20210115120242.89616-2-nbd@nbd.nameSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent e908435e
...@@ -136,20 +136,16 @@ ...@@ -136,20 +136,16 @@
__VHT_GROUP(_streams, _sgi, _bw, \ __VHT_GROUP(_streams, _sgi, _bw, \
VHT_GROUP_SHIFT(_streams, _sgi, _bw)) VHT_GROUP_SHIFT(_streams, _sgi, _bw))
#define CCK_DURATION(_bitrate, _short, _len) \ #define CCK_DURATION(_bitrate, _short) \
(1000 * (10 /* SIFS */ + \ (1000 * (10 /* SIFS */ + \
(_short ? 72 + 24 : 144 + 48) + \ (_short ? 72 + 24 : 144 + 48) + \
(8 * (_len + 4) * 10) / (_bitrate))) (8 * (AVG_PKT_SIZE + 4) * 10) / (_bitrate)))
#define CCK_ACK_DURATION(_bitrate, _short) \
(CCK_DURATION((_bitrate > 10 ? 20 : 10), false, 60) + \
CCK_DURATION(_bitrate, _short, AVG_PKT_SIZE))
#define CCK_DURATION_LIST(_short, _s) \ #define CCK_DURATION_LIST(_short, _s) \
CCK_ACK_DURATION(10, _short) >> _s, \ CCK_DURATION(10, _short) >> _s, \
CCK_ACK_DURATION(20, _short) >> _s, \ CCK_DURATION(20, _short) >> _s, \
CCK_ACK_DURATION(55, _short) >> _s, \ CCK_DURATION(55, _short) >> _s, \
CCK_ACK_DURATION(110, _short) >> _s CCK_DURATION(110, _short) >> _s
#define __CCK_GROUP(_s) \ #define __CCK_GROUP(_s) \
[MINSTREL_CCK_GROUP] = { \ [MINSTREL_CCK_GROUP] = { \
...@@ -163,7 +159,7 @@ ...@@ -163,7 +159,7 @@
} }
#define CCK_GROUP_SHIFT \ #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) #define CCK_GROUP __CCK_GROUP(CCK_GROUP_SHIFT)
...@@ -349,15 +345,19 @@ int ...@@ -349,15 +345,19 @@ int
minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate, minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate,
int prob_avg) 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% */ /* do not account throughput if sucess prob is below 10% */
if (prob_avg < MINSTREL_FRAC(10, 100)) if (prob_avg < MINSTREL_FRAC(10, 100))
return 0; return 0;
if (group != MINSTREL_CCK_GROUP) if (group == MINSTREL_CCK_GROUP)
nsecs = 1000 * mi->overhead / minstrel_ht_avg_ampdu_len(mi); 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] << nsecs += minstrel_mcs_groups[group].duration[rate] <<
minstrel_mcs_groups[group].shift; minstrel_mcs_groups[group].shift;
...@@ -1031,7 +1031,10 @@ minstrel_calc_retransmit(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, ...@@ -1031,7 +1031,10 @@ minstrel_calc_retransmit(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
ctime += (t_slot * cw) >> 1; ctime += (t_slot * cw) >> 1;
cw = min((cw << 1) | 1, mp->cw_max); 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 = mi->overhead;
overhead_rtscts = mi->overhead_rtscts; overhead_rtscts = mi->overhead_rtscts;
} }
...@@ -1369,18 +1372,14 @@ minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, ...@@ -1369,18 +1372,14 @@ minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
if (!ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES)) if (!ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES))
return; return;
mi->cck_supported = 0;
mi->cck_supported_short = 0;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (!rate_supported(sta, sband->band, mp->cck_rates[i])) if (!rate_supported(sta, sband->band, mp->cck_rates[i]))
continue; continue;
mi->cck_supported |= BIT(i); mi->supported[MINSTREL_CCK_GROUP] |= BIT(i);
if (sband->bitrates[i].flags & IEEE80211_RATE_SHORT_PREAMBLE) 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 static void
...@@ -1394,12 +1393,13 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband, ...@@ -1394,12 +1393,13 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs; struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
u16 ht_cap = sta->ht_cap.cap; u16 ht_cap = sta->ht_cap.cap;
struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap; struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
const struct ieee80211_rate *ctl_rate;
bool ldpc, erp;
int use_vht; int use_vht;
int n_supported = 0; int n_supported = 0;
int ack_dur; int ack_dur;
int stbc; int stbc;
int i; int i;
bool ldpc;
/* fall back to the old minstrel for legacy stations */ /* fall back to the old minstrel for legacy stations */
if (!sta->ht_cap.ht_supported) if (!sta->ht_cap.ht_supported)
...@@ -1423,6 +1423,14 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband, ...@@ -1423,6 +1423,14 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
mi->overhead += ack_dur; mi->overhead += ack_dur;
mi->overhead_rtscts = mi->overhead + 2 * 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); mi->avg_ampdu_len = MINSTREL_FRAC(1, 1);
/* When using MRR, sample more on the first attempt, without delay */ /* When using MRR, sample more on the first attempt, without delay */
...@@ -1523,8 +1531,6 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband, ...@@ -1523,8 +1531,6 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
if (!n_supported) if (!n_supported)
goto use_legacy; goto use_legacy;
mi->supported[MINSTREL_CCK_GROUP] |= mi->cck_supported_short << 4;
/* create an initial rate table with the lowest supported rates */ /* create an initial rate table with the lowest supported rates */
minstrel_ht_update_stats(mp, mi, true); minstrel_ht_update_stats(mp, mi, true);
minstrel_ht_update_rates(mp, mi); minstrel_ht_update_rates(mp, mi);
......
...@@ -77,6 +77,8 @@ struct minstrel_ht_sta { ...@@ -77,6 +77,8 @@ struct minstrel_ht_sta {
/* overhead time in usec for each frame */ /* overhead time in usec for each frame */
unsigned int overhead; unsigned int overhead;
unsigned int overhead_rtscts; unsigned int overhead_rtscts;
unsigned int overhead_legacy;
unsigned int overhead_legacy_rtscts;
unsigned int total_packets_last; unsigned int total_packets_last;
unsigned int total_packets_cur; unsigned int total_packets_cur;
...@@ -97,9 +99,6 @@ struct minstrel_ht_sta { ...@@ -97,9 +99,6 @@ struct minstrel_ht_sta {
/* current MCS group to be sampled */ /* current MCS group to be sampled */
u8 sample_group; u8 sample_group;
u8 cck_supported;
u8 cck_supported_short;
/* Bitfield of supported MCS rates of all groups */ /* Bitfield of supported MCS rates of all groups */
u16 supported[MINSTREL_GROUPS_NB]; u16 supported[MINSTREL_GROUPS_NB];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment