1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef __iwl_agn_rs_h__
28#define __iwl_agn_rs_h__
29
30#include <net/mac80211.h>
31
32#include "iwl-commands.h"
33
34struct iwl_rate_info {
35 u8 plcp;
36 u8 plcp_siso;
37 u8 plcp_mimo2;
38 u8 plcp_mimo3;
39 u8 ieee;
40 u8 prev_ieee;
41 u8 next_ieee;
42 u8 prev_rs;
43 u8 next_rs;
44 u8 prev_rs_tgg;
45 u8 next_rs_tgg;
46};
47
48
49
50
51
52enum {
53 IWL_RATE_1M_INDEX = 0,
54 IWL_RATE_2M_INDEX,
55 IWL_RATE_5M_INDEX,
56 IWL_RATE_11M_INDEX,
57 IWL_RATE_6M_INDEX,
58 IWL_RATE_9M_INDEX,
59 IWL_RATE_12M_INDEX,
60 IWL_RATE_18M_INDEX,
61 IWL_RATE_24M_INDEX,
62 IWL_RATE_36M_INDEX,
63 IWL_RATE_48M_INDEX,
64 IWL_RATE_54M_INDEX,
65 IWL_RATE_60M_INDEX,
66 IWL_RATE_COUNT,
67 IWL_RATE_COUNT_LEGACY = IWL_RATE_COUNT - 1,
68 IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
69 IWL_RATE_INVALID = IWL_RATE_COUNT,
70};
71
72enum {
73 IWL_RATE_6M_INDEX_TABLE = 0,
74 IWL_RATE_9M_INDEX_TABLE,
75 IWL_RATE_12M_INDEX_TABLE,
76 IWL_RATE_18M_INDEX_TABLE,
77 IWL_RATE_24M_INDEX_TABLE,
78 IWL_RATE_36M_INDEX_TABLE,
79 IWL_RATE_48M_INDEX_TABLE,
80 IWL_RATE_54M_INDEX_TABLE,
81 IWL_RATE_1M_INDEX_TABLE,
82 IWL_RATE_2M_INDEX_TABLE,
83 IWL_RATE_5M_INDEX_TABLE,
84 IWL_RATE_11M_INDEX_TABLE,
85 IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX - 1,
86};
87
88enum {
89 IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
90 IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX,
91 IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
92 IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
93};
94
95
96#define IWL_RATE_6M_MASK (1 << IWL_RATE_6M_INDEX)
97#define IWL_RATE_9M_MASK (1 << IWL_RATE_9M_INDEX)
98#define IWL_RATE_12M_MASK (1 << IWL_RATE_12M_INDEX)
99#define IWL_RATE_18M_MASK (1 << IWL_RATE_18M_INDEX)
100#define IWL_RATE_24M_MASK (1 << IWL_RATE_24M_INDEX)
101#define IWL_RATE_36M_MASK (1 << IWL_RATE_36M_INDEX)
102#define IWL_RATE_48M_MASK (1 << IWL_RATE_48M_INDEX)
103#define IWL_RATE_54M_MASK (1 << IWL_RATE_54M_INDEX)
104#define IWL_RATE_60M_MASK (1 << IWL_RATE_60M_INDEX)
105#define IWL_RATE_1M_MASK (1 << IWL_RATE_1M_INDEX)
106#define IWL_RATE_2M_MASK (1 << IWL_RATE_2M_INDEX)
107#define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX)
108#define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX)
109
110
111enum {
112 IWL_RATE_6M_PLCP = 13,
113 IWL_RATE_9M_PLCP = 15,
114 IWL_RATE_12M_PLCP = 5,
115 IWL_RATE_18M_PLCP = 7,
116 IWL_RATE_24M_PLCP = 9,
117 IWL_RATE_36M_PLCP = 11,
118 IWL_RATE_48M_PLCP = 1,
119 IWL_RATE_54M_PLCP = 3,
120 IWL_RATE_60M_PLCP = 3,
121 IWL_RATE_1M_PLCP = 10,
122 IWL_RATE_2M_PLCP = 20,
123 IWL_RATE_5M_PLCP = 55,
124 IWL_RATE_11M_PLCP = 110,
125
126
127};
128
129
130enum {
131 IWL_RATE_SISO_6M_PLCP = 0,
132 IWL_RATE_SISO_12M_PLCP = 1,
133 IWL_RATE_SISO_18M_PLCP = 2,
134 IWL_RATE_SISO_24M_PLCP = 3,
135 IWL_RATE_SISO_36M_PLCP = 4,
136 IWL_RATE_SISO_48M_PLCP = 5,
137 IWL_RATE_SISO_54M_PLCP = 6,
138 IWL_RATE_SISO_60M_PLCP = 7,
139 IWL_RATE_MIMO2_6M_PLCP = 0x8,
140 IWL_RATE_MIMO2_12M_PLCP = 0x9,
141 IWL_RATE_MIMO2_18M_PLCP = 0xa,
142 IWL_RATE_MIMO2_24M_PLCP = 0xb,
143 IWL_RATE_MIMO2_36M_PLCP = 0xc,
144 IWL_RATE_MIMO2_48M_PLCP = 0xd,
145 IWL_RATE_MIMO2_54M_PLCP = 0xe,
146 IWL_RATE_MIMO2_60M_PLCP = 0xf,
147 IWL_RATE_MIMO3_6M_PLCP = 0x10,
148 IWL_RATE_MIMO3_12M_PLCP = 0x11,
149 IWL_RATE_MIMO3_18M_PLCP = 0x12,
150 IWL_RATE_MIMO3_24M_PLCP = 0x13,
151 IWL_RATE_MIMO3_36M_PLCP = 0x14,
152 IWL_RATE_MIMO3_48M_PLCP = 0x15,
153 IWL_RATE_MIMO3_54M_PLCP = 0x16,
154 IWL_RATE_MIMO3_60M_PLCP = 0x17,
155 IWL_RATE_SISO_INVM_PLCP,
156 IWL_RATE_MIMO2_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
157 IWL_RATE_MIMO3_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
158};
159
160
161enum {
162 IWL_RATE_6M_IEEE = 12,
163 IWL_RATE_9M_IEEE = 18,
164 IWL_RATE_12M_IEEE = 24,
165 IWL_RATE_18M_IEEE = 36,
166 IWL_RATE_24M_IEEE = 48,
167 IWL_RATE_36M_IEEE = 72,
168 IWL_RATE_48M_IEEE = 96,
169 IWL_RATE_54M_IEEE = 108,
170 IWL_RATE_60M_IEEE = 120,
171 IWL_RATE_1M_IEEE = 2,
172 IWL_RATE_2M_IEEE = 4,
173 IWL_RATE_5M_IEEE = 11,
174 IWL_RATE_11M_IEEE = 22,
175};
176
177#define IWL_CCK_BASIC_RATES_MASK \
178 (IWL_RATE_1M_MASK | \
179 IWL_RATE_2M_MASK)
180
181#define IWL_CCK_RATES_MASK \
182 (IWL_CCK_BASIC_RATES_MASK | \
183 IWL_RATE_5M_MASK | \
184 IWL_RATE_11M_MASK)
185
186#define IWL_OFDM_BASIC_RATES_MASK \
187 (IWL_RATE_6M_MASK | \
188 IWL_RATE_12M_MASK | \
189 IWL_RATE_24M_MASK)
190
191#define IWL_OFDM_RATES_MASK \
192 (IWL_OFDM_BASIC_RATES_MASK | \
193 IWL_RATE_9M_MASK | \
194 IWL_RATE_18M_MASK | \
195 IWL_RATE_36M_MASK | \
196 IWL_RATE_48M_MASK | \
197 IWL_RATE_54M_MASK)
198
199#define IWL_BASIC_RATES_MASK \
200 (IWL_OFDM_BASIC_RATES_MASK | \
201 IWL_CCK_BASIC_RATES_MASK)
202
203#define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
204
205#define IWL_INVALID_VALUE -1
206
207#define IWL_MIN_RSSI_VAL -100
208#define IWL_MAX_RSSI_VAL 0
209
210
211
212#define IWL_LEGACY_FAILURE_LIMIT 160
213#define IWL_LEGACY_SUCCESS_LIMIT 480
214#define IWL_LEGACY_TABLE_COUNT 160
215
216#define IWL_NONE_LEGACY_FAILURE_LIMIT 400
217#define IWL_NONE_LEGACY_SUCCESS_LIMIT 4500
218#define IWL_NONE_LEGACY_TABLE_COUNT 1500
219
220
221#define IWL_RS_GOOD_RATIO 12800
222#define IWL_RATE_SCALE_SWITCH 10880
223#define IWL_RATE_HIGH_TH 10880
224#define IWL_RATE_INCREASE_TH 6400
225#define IWL_RATE_DECREASE_TH 1920
226
227
228#define IWL_LEGACY_SWITCH_ANTENNA1 0
229#define IWL_LEGACY_SWITCH_ANTENNA2 1
230#define IWL_LEGACY_SWITCH_SISO 2
231#define IWL_LEGACY_SWITCH_MIMO2_AB 3
232#define IWL_LEGACY_SWITCH_MIMO2_AC 4
233#define IWL_LEGACY_SWITCH_MIMO2_BC 5
234#define IWL_LEGACY_SWITCH_MIMO3_ABC 6
235
236
237#define IWL_SISO_SWITCH_ANTENNA1 0
238#define IWL_SISO_SWITCH_ANTENNA2 1
239#define IWL_SISO_SWITCH_MIMO2_AB 2
240#define IWL_SISO_SWITCH_MIMO2_AC 3
241#define IWL_SISO_SWITCH_MIMO2_BC 4
242#define IWL_SISO_SWITCH_GI 5
243#define IWL_SISO_SWITCH_MIMO3_ABC 6
244
245
246
247#define IWL_MIMO2_SWITCH_ANTENNA1 0
248#define IWL_MIMO2_SWITCH_ANTENNA2 1
249#define IWL_MIMO2_SWITCH_SISO_A 2
250#define IWL_MIMO2_SWITCH_SISO_B 3
251#define IWL_MIMO2_SWITCH_SISO_C 4
252#define IWL_MIMO2_SWITCH_GI 5
253#define IWL_MIMO2_SWITCH_MIMO3_ABC 6
254
255
256
257#define IWL_MIMO3_SWITCH_ANTENNA1 0
258#define IWL_MIMO3_SWITCH_ANTENNA2 1
259#define IWL_MIMO3_SWITCH_SISO_A 2
260#define IWL_MIMO3_SWITCH_SISO_B 3
261#define IWL_MIMO3_SWITCH_SISO_C 4
262#define IWL_MIMO3_SWITCH_MIMO2_AB 5
263#define IWL_MIMO3_SWITCH_MIMO2_AC 6
264#define IWL_MIMO3_SWITCH_MIMO2_BC 7
265#define IWL_MIMO3_SWITCH_GI 8
266
267
268#define IWL_MAX_11N_MIMO3_SEARCH IWL_MIMO3_SWITCH_GI
269#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_MIMO3_ABC
270
271
272
273#define IWL_ACTION_LIMIT 3
274
275#define LQ_SIZE 2
276
277
278#define IWL_AGG_TPT_THREHOLD 0
279#define IWL_AGG_LOAD_THRESHOLD 10
280#define IWL_AGG_ALL_TID 0xff
281#define TID_QUEUE_CELL_SPACING 50
282#define TID_QUEUE_MAX_SIZE 20
283#define TID_ROUND_VALUE 5
284#define TID_MAX_LOAD_COUNT 8
285
286#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING)
287#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
288
289extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
290
291enum iwl_table_type {
292 LQ_NONE,
293 LQ_G,
294 LQ_A,
295 LQ_SISO,
296 LQ_MIMO2,
297 LQ_MIMO3,
298 LQ_MAX,
299};
300
301#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A))
302#define is_siso(tbl) ((tbl) == LQ_SISO)
303#define is_mimo2(tbl) ((tbl) == LQ_MIMO2)
304#define is_mimo3(tbl) ((tbl) == LQ_MIMO3)
305#define is_mimo(tbl) (is_mimo2(tbl) || is_mimo3(tbl))
306#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl))
307#define is_a_band(tbl) ((tbl) == LQ_A)
308#define is_g_and(tbl) ((tbl) == LQ_G)
309
310#define ANT_NONE 0x0
311#define ANT_A BIT(0)
312#define ANT_B BIT(1)
313#define ANT_AB (ANT_A | ANT_B)
314#define ANT_C BIT(2)
315#define ANT_AC (ANT_A | ANT_C)
316#define ANT_BC (ANT_B | ANT_C)
317#define ANT_ABC (ANT_AB | ANT_C)
318
319#define IWL_MAX_MCS_DISPLAY_SIZE 12
320
321struct iwl_rate_mcs_info {
322 char mbps[IWL_MAX_MCS_DISPLAY_SIZE];
323 char mcs[IWL_MAX_MCS_DISPLAY_SIZE];
324};
325
326
327
328
329struct iwl_rate_scale_data {
330 u64 data;
331 s32 success_counter;
332 s32 success_ratio;
333 s32 counter;
334 s32 average_tpt;
335 unsigned long stamp;
336};
337
338
339
340
341
342
343
344struct iwl_scale_tbl_info {
345 enum iwl_table_type lq_type;
346 u8 ant_type;
347 u8 is_SGI;
348 u8 is_ht40;
349 u8 is_dup;
350 u8 action;
351 u8 max_search;
352 s32 *expected_tpt;
353 u32 current_rate;
354 struct iwl_rate_scale_data win[IWL_RATE_COUNT];
355};
356
357struct iwl_traffic_load {
358 unsigned long time_stamp;
359 u32 packet_count[TID_QUEUE_MAX_SIZE];
360
361 u32 total;
362
363 u8 queue_count;
364
365 u8 head;
366};
367
368
369
370
371
372
373struct iwl_lq_sta {
374 u8 active_tbl;
375 u8 enable_counter;
376 u8 stay_in_tbl;
377 u8 search_better_tbl;
378 s32 last_tpt;
379
380
381 u32 table_count_limit;
382 u32 max_failure_limit;
383 u32 max_success_limit;
384 u32 table_count;
385 u32 total_failed;
386 u32 total_success;
387 u64 flush_timer;
388
389 u8 action_counter;
390 u8 is_green;
391 u8 is_dup;
392 enum ieee80211_band band;
393
394
395 u32 supp_rates;
396 u16 active_legacy_rate;
397 u16 active_siso_rate;
398 u16 active_mimo2_rate;
399 u16 active_mimo3_rate;
400 s8 max_rate_idx;
401 u8 missed_rate_counter;
402
403 struct iwl_link_quality_cmd lq;
404 struct iwl_scale_tbl_info lq_info[LQ_SIZE];
405 struct iwl_traffic_load load[TID_MAX_LOAD_COUNT];
406 u8 tx_agg_tid_en;
407#ifdef CONFIG_MAC80211_DEBUGFS
408 struct dentry *rs_sta_dbgfs_scale_table_file;
409 struct dentry *rs_sta_dbgfs_stats_table_file;
410 struct dentry *rs_sta_dbgfs_rate_scale_data_file;
411 struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file;
412 u32 dbg_fixed_rate;
413#endif
414 struct iwl_priv *drv;
415
416
417 int last_txrate_idx;
418
419 u32 last_rate_n_flags;
420
421 u8 is_agg;
422
423 u8 last_bt_traffic;
424};
425
426static inline u8 num_of_ant(u8 mask)
427{
428 return !!((mask) & ANT_A) +
429 !!((mask) & ANT_B) +
430 !!((mask) & ANT_C);
431}
432
433static inline u8 first_antenna(u8 mask)
434{
435 if (mask & ANT_A)
436 return ANT_A;
437 if (mask & ANT_B)
438 return ANT_B;
439 return ANT_C;
440}
441
442
443
444extern void iwl_rs_rate_init(struct iwl_priv *priv,
445 struct ieee80211_sta *sta, u8 sta_id);
446
447
448
449
450
451
452
453
454
455
456
457extern int iwlagn_rate_control_register(void);
458
459
460
461
462
463
464
465extern void iwlagn_rate_control_unregister(void);
466
467#endif
468