Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
ec8aa669 FF |
2 | /* |
3 | * Copyright (C) 2010 Felix Fietkau <nbd@openwrt.org> | |
ec8aa669 FF |
4 | */ |
5 | ||
6 | #ifndef __RC_MINSTREL_HT_H | |
7 | #define __RC_MINSTREL_HT_H | |
8 | ||
a42fa256 FF |
9 | #include <linux/bitfield.h> |
10 | ||
cbda98c7 FF |
11 | /* number of highest throughput rates to consider*/ |
12 | #define MAX_THR_RATES 4 | |
13 | #define SAMPLE_COLUMNS 10 /* number of columns in sample table */ | |
14 | ||
15 | /* scaled fraction values */ | |
16 | #define MINSTREL_SCALE 12 | |
17 | #define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div) | |
18 | #define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE) | |
19 | ||
20 | #define EWMA_LEVEL 96 /* ewma weighting factor [/EWMA_DIV] */ | |
21 | #define EWMA_DIV 128 | |
22 | ||
23 | /* | |
24 | * Coefficients for moving average with noise filter (period=16), | |
25 | * scaled by 10 bits | |
26 | * | |
27 | * a1 = exp(-pi * sqrt(2) / period) | |
28 | * coeff2 = 2 * a1 * cos(sqrt(2) * 2 * pi / period) | |
29 | * coeff3 = -sqr(a1) | |
30 | * coeff1 = 1 - coeff2 - coeff3 | |
31 | */ | |
32 | #define MINSTREL_AVG_COEFF1 (MINSTREL_FRAC(1, 1) - \ | |
33 | MINSTREL_AVG_COEFF2 - \ | |
34 | MINSTREL_AVG_COEFF3) | |
35 | #define MINSTREL_AVG_COEFF2 0x00001499 | |
36 | #define MINSTREL_AVG_COEFF3 -0x0000092e | |
37 | ||
ec8aa669 FF |
38 | /* |
39 | * The number of streams can be changed to 2 to reduce code | |
40 | * size and memory footprint. | |
41 | */ | |
7f2e12e1 | 42 | #define MINSTREL_MAX_STREAMS 4 |
8a0ee4fe | 43 | #define MINSTREL_HT_STREAM_GROUPS 4 /* BW(=2) * SGI(=2) */ |
9208247d | 44 | #define MINSTREL_VHT_STREAM_GROUPS 6 /* BW(=3) * SGI(=2) */ |
8a0ee4fe KB |
45 | |
46 | #define MINSTREL_HT_GROUPS_NB (MINSTREL_MAX_STREAMS * \ | |
47 | MINSTREL_HT_STREAM_GROUPS) | |
9208247d KB |
48 | #define MINSTREL_VHT_GROUPS_NB (MINSTREL_MAX_STREAMS * \ |
49 | MINSTREL_VHT_STREAM_GROUPS) | |
a7844a53 | 50 | #define MINSTREL_LEGACY_GROUPS_NB 2 |
8a0ee4fe | 51 | #define MINSTREL_GROUPS_NB (MINSTREL_HT_GROUPS_NB + \ |
9208247d | 52 | MINSTREL_VHT_GROUPS_NB + \ |
a7844a53 | 53 | MINSTREL_LEGACY_GROUPS_NB) |
8a0ee4fe KB |
54 | |
55 | #define MINSTREL_HT_GROUP_0 0 | |
56 | #define MINSTREL_CCK_GROUP (MINSTREL_HT_GROUP_0 + MINSTREL_HT_GROUPS_NB) | |
a7844a53 FF |
57 | #define MINSTREL_OFDM_GROUP (MINSTREL_CCK_GROUP + 1) |
58 | #define MINSTREL_VHT_GROUP_0 (MINSTREL_OFDM_GROUP + 1) | |
ec8aa669 | 59 | |
9208247d | 60 | #define MCS_GROUP_RATES 10 |
ec8aa669 | 61 | |
a42fa256 FF |
62 | #define MI_RATE_IDX_MASK GENMASK(3, 0) |
63 | #define MI_RATE_GROUP_MASK GENMASK(15, 4) | |
64 | ||
65 | #define MI_RATE(_group, _idx) \ | |
66 | (FIELD_PREP(MI_RATE_GROUP_MASK, _group) | \ | |
67 | FIELD_PREP(MI_RATE_IDX_MASK, _idx)) | |
68 | ||
69 | #define MI_RATE_IDX(_rate) FIELD_GET(MI_RATE_IDX_MASK, _rate) | |
70 | #define MI_RATE_GROUP(_rate) FIELD_GET(MI_RATE_GROUP_MASK, _rate) | |
71 | ||
80d55154 FF |
72 | #define MINSTREL_SAMPLE_RATES 5 /* rates per sample type */ |
73 | #define MINSTREL_SAMPLE_INTERVAL (HZ / 50) | |
a42fa256 | 74 | |
cbda98c7 FF |
75 | struct minstrel_priv { |
76 | struct ieee80211_hw *hw; | |
cbda98c7 FF |
77 | unsigned int cw_min; |
78 | unsigned int cw_max; | |
79 | unsigned int max_retry; | |
80 | unsigned int segment_size; | |
81 | unsigned int update_interval; | |
82 | ||
83 | u8 cck_rates[4]; | |
84 | u8 ofdm_rates[NUM_NL80211_BANDS][8]; | |
85 | ||
86 | #ifdef CONFIG_MAC80211_DEBUGFS | |
87 | /* | |
88 | * enable fixed rate processing per RC | |
89 | * - write static index to debugfs:ieee80211/phyX/rc/fixed_rate_idx | |
90 | * - write -1 to enable RC processing again | |
91 | * - setting will be applied on next update | |
92 | */ | |
93 | u32 fixed_rate_idx; | |
94 | #endif | |
95 | }; | |
96 | ||
97 | ||
ec8aa669 | 98 | struct mcs_group { |
202df504 FF |
99 | u16 flags; |
100 | u8 streams; | |
101 | u8 shift; | |
48cb3952 | 102 | u8 bw; |
202df504 | 103 | u16 duration[MCS_GROUP_RATES]; |
ec8aa669 FF |
104 | }; |
105 | ||
a7844a53 FF |
106 | extern const s16 minstrel_cck_bitrates[4]; |
107 | extern const s16 minstrel_ofdm_bitrates[8]; | |
de66bfd8 JL |
108 | extern const struct mcs_group minstrel_mcs_groups[]; |
109 | ||
cbda98c7 FF |
110 | struct minstrel_rate_stats { |
111 | /* current / last sampling period attempts/success counters */ | |
112 | u16 attempts, last_attempts; | |
113 | u16 success, last_success; | |
114 | ||
115 | /* total attempts/success counters */ | |
116 | u32 att_hist, succ_hist; | |
117 | ||
118 | /* prob_avg - moving average of prob */ | |
119 | u16 prob_avg; | |
120 | u16 prob_avg_1; | |
121 | ||
122 | /* maximum retry counts */ | |
123 | u8 retry_count; | |
124 | u8 retry_count_rtscts; | |
125 | ||
cbda98c7 FF |
126 | bool retry_updated; |
127 | }; | |
128 | ||
80d55154 FF |
129 | enum minstrel_sample_type { |
130 | MINSTREL_SAMPLE_TYPE_INC, | |
131 | MINSTREL_SAMPLE_TYPE_JUMP, | |
132 | MINSTREL_SAMPLE_TYPE_SLOW, | |
133 | __MINSTREL_SAMPLE_TYPE_MAX | |
134 | }; | |
135 | ||
ec8aa669 FF |
136 | struct minstrel_mcs_group_data { |
137 | u8 index; | |
138 | u8 column; | |
139 | ||
5935839a | 140 | /* sorted rate set within a MCS group*/ |
d4d141ca KB |
141 | u16 max_group_tp_rate[MAX_THR_RATES]; |
142 | u16 max_group_prob_rate; | |
ec8aa669 FF |
143 | |
144 | /* MCS rate statistics */ | |
145 | struct minstrel_rate_stats rates[MCS_GROUP_RATES]; | |
146 | }; | |
147 | ||
80d55154 FF |
148 | struct minstrel_sample_category { |
149 | u8 sample_group; | |
150 | u16 sample_rates[MINSTREL_SAMPLE_RATES]; | |
151 | u16 cur_sample_rates[MINSTREL_SAMPLE_RATES]; | |
152 | }; | |
153 | ||
ec8aa669 | 154 | struct minstrel_ht_sta { |
a8566662 FF |
155 | struct ieee80211_sta *sta; |
156 | ||
ec8aa669 FF |
157 | /* ampdu length (average, per sampling interval) */ |
158 | unsigned int ampdu_len; | |
159 | unsigned int ampdu_packets; | |
160 | ||
161 | /* ampdu length (EWMA) */ | |
162 | unsigned int avg_ampdu_len; | |
163 | ||
5935839a | 164 | /* overall sorted rate set */ |
d4d141ca KB |
165 | u16 max_tp_rate[MAX_THR_RATES]; |
166 | u16 max_prob_rate; | |
ec8aa669 FF |
167 | |
168 | /* time of last status update */ | |
9134073b | 169 | unsigned long last_stats_update; |
ec8aa669 FF |
170 | |
171 | /* overhead time in usec for each frame */ | |
172 | unsigned int overhead; | |
173 | unsigned int overhead_rtscts; | |
f84de063 FF |
174 | unsigned int overhead_legacy; |
175 | unsigned int overhead_legacy_rtscts; | |
ec8aa669 FF |
176 | |
177 | unsigned int total_packets; | |
178 | unsigned int sample_packets; | |
179 | ||
180 | /* tx flags to add for frames for this sta */ | |
181 | u32 tx_flags; | |
569cf386 | 182 | bool use_short_preamble; |
c0eb09aa | 183 | u8 band; |
80d55154 FF |
184 | |
185 | u8 sample_seq; | |
48cb3952 FF |
186 | u16 sample_rate; |
187 | ||
c0eb09aa FF |
188 | unsigned long sample_time; |
189 | struct minstrel_sample_category sample[__MINSTREL_SAMPLE_TYPE_MAX]; | |
a7844a53 | 190 | |
41d08583 FF |
191 | /* Bitfield of supported MCS rates of all groups */ |
192 | u16 supported[MINSTREL_GROUPS_NB]; | |
193 | ||
ec8aa669 | 194 | /* MCS rate group info and statistics */ |
8a0ee4fe | 195 | struct minstrel_mcs_group_data groups[MINSTREL_GROUPS_NB]; |
ec8aa669 FF |
196 | }; |
197 | ||
ec8aa669 | 198 | void minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir); |
50e55a8e | 199 | int minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate, |
5f63afe0 | 200 | int prob_avg); |
ec8aa669 FF |
201 | |
202 | #endif |