Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
net
wireless
iwlwifi
dvm
rs.h
Go to the documentation of this file.
1
/******************************************************************************
2
*
3
* Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
* You should have received a copy of the GNU General Public License along with
15
* this program; if not, write to the Free Software Foundation, Inc.,
16
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17
*
18
* The full GNU General Public License is included in this distribution in the
19
* file called LICENSE.
20
*
21
* Contact Information:
22
* Intel Linux Wireless <
[email protected]
>
23
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
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-config.h
"
33
34
#include "
commands.h
"
35
36
struct
iwl_rate_info
{
37
u8
plcp
;
/* uCode API: IWL_RATE_6M_PLCP, etc. */
38
u8
plcp_siso
;
/* uCode API: IWL_RATE_SISO_6M_PLCP, etc. */
39
u8
plcp_mimo2
;
/* uCode API: IWL_RATE_MIMO2_6M_PLCP, etc. */
40
u8
plcp_mimo3
;
/* uCode API: IWL_RATE_MIMO3_6M_PLCP, etc. */
41
u8
ieee
;
/* MAC header: IWL_RATE_6M_IEEE, etc. */
42
u8
prev_ieee
;
/* previous rate in IEEE speeds */
43
u8
next_ieee
;
/* next rate in IEEE speeds */
44
u8
prev_rs
;
/* previous rate used in rs algo */
45
u8
next_rs
;
/* next rate used in rs algo */
46
u8
prev_rs_tgg
;
/* previous rate used in TGG rs algo */
47
u8
next_rs_tgg
;
/* next rate used in TGG rs algo */
48
};
49
50
/*
51
* These serve as indexes into
52
* struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
53
*/
54
enum
{
55
IWL_RATE_1M_INDEX
= 0,
56
IWL_RATE_2M_INDEX
,
57
IWL_RATE_5M_INDEX
,
58
IWL_RATE_11M_INDEX
,
59
IWL_RATE_6M_INDEX
,
60
IWL_RATE_9M_INDEX
,
61
IWL_RATE_12M_INDEX
,
62
IWL_RATE_18M_INDEX
,
63
IWL_RATE_24M_INDEX
,
64
IWL_RATE_36M_INDEX
,
65
IWL_RATE_48M_INDEX
,
66
IWL_RATE_54M_INDEX
,
67
IWL_RATE_60M_INDEX
,
68
IWL_RATE_COUNT
,
/*FIXME:RS:change to IWL_RATE_INDEX_COUNT,*/
69
IWL_RATE_COUNT_LEGACY
=
IWL_RATE_COUNT
- 1,
/* Excluding 60M */
70
IWL_RATE_INVM_INDEX
=
IWL_RATE_COUNT
,
71
IWL_RATE_INVALID
=
IWL_RATE_COUNT
,
72
};
73
74
enum
{
75
IWL_RATE_6M_INDEX_TABLE
= 0,
76
IWL_RATE_9M_INDEX_TABLE
,
77
IWL_RATE_12M_INDEX_TABLE
,
78
IWL_RATE_18M_INDEX_TABLE
,
79
IWL_RATE_24M_INDEX_TABLE
,
80
IWL_RATE_36M_INDEX_TABLE
,
81
IWL_RATE_48M_INDEX_TABLE
,
82
IWL_RATE_54M_INDEX_TABLE
,
83
IWL_RATE_1M_INDEX_TABLE
,
84
IWL_RATE_2M_INDEX_TABLE
,
85
IWL_RATE_5M_INDEX_TABLE
,
86
IWL_RATE_11M_INDEX_TABLE
,
87
IWL_RATE_INVM_INDEX_TABLE
=
IWL_RATE_INVM_INDEX
- 1,
88
};
89
90
enum
{
91
IWL_FIRST_OFDM_RATE
=
IWL_RATE_6M_INDEX
,
92
IWL_LAST_OFDM_RATE
=
IWL_RATE_60M_INDEX
,
93
IWL_FIRST_CCK_RATE
=
IWL_RATE_1M_INDEX
,
94
IWL_LAST_CCK_RATE
=
IWL_RATE_11M_INDEX
,
95
};
96
97
/* #define vs. enum to keep from defaulting to 'large integer' */
98
#define IWL_RATE_6M_MASK (1 << IWL_RATE_6M_INDEX)
99
#define IWL_RATE_9M_MASK (1 << IWL_RATE_9M_INDEX)
100
#define IWL_RATE_12M_MASK (1 << IWL_RATE_12M_INDEX)
101
#define IWL_RATE_18M_MASK (1 << IWL_RATE_18M_INDEX)
102
#define IWL_RATE_24M_MASK (1 << IWL_RATE_24M_INDEX)
103
#define IWL_RATE_36M_MASK (1 << IWL_RATE_36M_INDEX)
104
#define IWL_RATE_48M_MASK (1 << IWL_RATE_48M_INDEX)
105
#define IWL_RATE_54M_MASK (1 << IWL_RATE_54M_INDEX)
106
#define IWL_RATE_60M_MASK (1 << IWL_RATE_60M_INDEX)
107
#define IWL_RATE_1M_MASK (1 << IWL_RATE_1M_INDEX)
108
#define IWL_RATE_2M_MASK (1 << IWL_RATE_2M_INDEX)
109
#define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX)
110
#define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX)
111
112
/* uCode API values for legacy bit rates, both OFDM and CCK */
113
enum
{
114
IWL_RATE_6M_PLCP
= 13,
115
IWL_RATE_9M_PLCP
= 15,
116
IWL_RATE_12M_PLCP
= 5,
117
IWL_RATE_18M_PLCP
= 7,
118
IWL_RATE_24M_PLCP
= 9,
119
IWL_RATE_36M_PLCP
= 11,
120
IWL_RATE_48M_PLCP
= 1,
121
IWL_RATE_54M_PLCP
= 3,
122
IWL_RATE_60M_PLCP
= 3,
/*FIXME:RS:should be removed*/
123
IWL_RATE_1M_PLCP
= 10,
124
IWL_RATE_2M_PLCP
= 20,
125
IWL_RATE_5M_PLCP
= 55,
126
IWL_RATE_11M_PLCP
= 110,
127
/*FIXME:RS:change to IWL_RATE_LEGACY_??M_PLCP */
128
/*FIXME:RS:add IWL_RATE_LEGACY_INVM_PLCP = 0,*/
129
};
130
131
/* uCode API values for OFDM high-throughput (HT) bit rates */
132
enum
{
133
IWL_RATE_SISO_6M_PLCP
= 0,
134
IWL_RATE_SISO_12M_PLCP
= 1,
135
IWL_RATE_SISO_18M_PLCP
= 2,
136
IWL_RATE_SISO_24M_PLCP
= 3,
137
IWL_RATE_SISO_36M_PLCP
= 4,
138
IWL_RATE_SISO_48M_PLCP
= 5,
139
IWL_RATE_SISO_54M_PLCP
= 6,
140
IWL_RATE_SISO_60M_PLCP
= 7,
141
IWL_RATE_MIMO2_6M_PLCP
= 0x8,
142
IWL_RATE_MIMO2_12M_PLCP
= 0x9,
143
IWL_RATE_MIMO2_18M_PLCP
= 0xa,
144
IWL_RATE_MIMO2_24M_PLCP
= 0xb,
145
IWL_RATE_MIMO2_36M_PLCP
= 0xc,
146
IWL_RATE_MIMO2_48M_PLCP
= 0xd,
147
IWL_RATE_MIMO2_54M_PLCP
= 0xe,
148
IWL_RATE_MIMO2_60M_PLCP
= 0xf,
149
IWL_RATE_MIMO3_6M_PLCP
= 0x10,
150
IWL_RATE_MIMO3_12M_PLCP
= 0x11,
151
IWL_RATE_MIMO3_18M_PLCP
= 0x12,
152
IWL_RATE_MIMO3_24M_PLCP
= 0x13,
153
IWL_RATE_MIMO3_36M_PLCP
= 0x14,
154
IWL_RATE_MIMO3_48M_PLCP
= 0x15,
155
IWL_RATE_MIMO3_54M_PLCP
= 0x16,
156
IWL_RATE_MIMO3_60M_PLCP
= 0x17,
157
IWL_RATE_SISO_INVM_PLCP
,
158
IWL_RATE_MIMO2_INVM_PLCP
=
IWL_RATE_SISO_INVM_PLCP
,
159
IWL_RATE_MIMO3_INVM_PLCP
=
IWL_RATE_SISO_INVM_PLCP
,
160
};
161
162
/* MAC header values for bit rates */
163
enum
{
164
IWL_RATE_6M_IEEE
= 12,
165
IWL_RATE_9M_IEEE
= 18,
166
IWL_RATE_12M_IEEE
= 24,
167
IWL_RATE_18M_IEEE
= 36,
168
IWL_RATE_24M_IEEE
= 48,
169
IWL_RATE_36M_IEEE
= 72,
170
IWL_RATE_48M_IEEE
= 96,
171
IWL_RATE_54M_IEEE
= 108,
172
IWL_RATE_60M_IEEE
= 120,
173
IWL_RATE_1M_IEEE
= 2,
174
IWL_RATE_2M_IEEE
= 4,
175
IWL_RATE_5M_IEEE
= 11,
176
IWL_RATE_11M_IEEE
= 22,
177
};
178
179
#define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
180
181
#define IWL_INVALID_VALUE -1
182
183
#define IWL_MIN_RSSI_VAL -100
184
#define IWL_MAX_RSSI_VAL 0
185
186
/* These values specify how many Tx frame attempts before
187
* searching for a new modulation mode */
188
#define IWL_LEGACY_FAILURE_LIMIT 160
189
#define IWL_LEGACY_SUCCESS_LIMIT 480
190
#define IWL_LEGACY_TABLE_COUNT 160
191
192
#define IWL_NONE_LEGACY_FAILURE_LIMIT 400
193
#define IWL_NONE_LEGACY_SUCCESS_LIMIT 4500
194
#define IWL_NONE_LEGACY_TABLE_COUNT 1500
195
196
/* Success ratio (ACKed / attempted tx frames) values (perfect is 128 * 100) */
197
#define IWL_RS_GOOD_RATIO 12800
/* 100% */
198
#define IWL_RATE_SCALE_SWITCH 10880
/* 85% */
199
#define IWL_RATE_HIGH_TH 10880
/* 85% */
200
#define IWL_RATE_INCREASE_TH 6400
/* 50% */
201
#define IWL_RATE_DECREASE_TH 1920
/* 15% */
202
203
/* possible actions when in legacy mode */
204
#define IWL_LEGACY_SWITCH_ANTENNA1 0
205
#define IWL_LEGACY_SWITCH_ANTENNA2 1
206
#define IWL_LEGACY_SWITCH_SISO 2
207
#define IWL_LEGACY_SWITCH_MIMO2_AB 3
208
#define IWL_LEGACY_SWITCH_MIMO2_AC 4
209
#define IWL_LEGACY_SWITCH_MIMO2_BC 5
210
#define IWL_LEGACY_SWITCH_MIMO3_ABC 6
211
212
/* possible actions when in siso mode */
213
#define IWL_SISO_SWITCH_ANTENNA1 0
214
#define IWL_SISO_SWITCH_ANTENNA2 1
215
#define IWL_SISO_SWITCH_MIMO2_AB 2
216
#define IWL_SISO_SWITCH_MIMO2_AC 3
217
#define IWL_SISO_SWITCH_MIMO2_BC 4
218
#define IWL_SISO_SWITCH_GI 5
219
#define IWL_SISO_SWITCH_MIMO3_ABC 6
220
221
222
/* possible actions when in mimo mode */
223
#define IWL_MIMO2_SWITCH_ANTENNA1 0
224
#define IWL_MIMO2_SWITCH_ANTENNA2 1
225
#define IWL_MIMO2_SWITCH_SISO_A 2
226
#define IWL_MIMO2_SWITCH_SISO_B 3
227
#define IWL_MIMO2_SWITCH_SISO_C 4
228
#define IWL_MIMO2_SWITCH_GI 5
229
#define IWL_MIMO2_SWITCH_MIMO3_ABC 6
230
231
232
/* possible actions when in mimo3 mode */
233
#define IWL_MIMO3_SWITCH_ANTENNA1 0
234
#define IWL_MIMO3_SWITCH_ANTENNA2 1
235
#define IWL_MIMO3_SWITCH_SISO_A 2
236
#define IWL_MIMO3_SWITCH_SISO_B 3
237
#define IWL_MIMO3_SWITCH_SISO_C 4
238
#define IWL_MIMO3_SWITCH_MIMO2_AB 5
239
#define IWL_MIMO3_SWITCH_MIMO2_AC 6
240
#define IWL_MIMO3_SWITCH_MIMO2_BC 7
241
#define IWL_MIMO3_SWITCH_GI 8
242
243
244
#define IWL_MAX_11N_MIMO3_SEARCH IWL_MIMO3_SWITCH_GI
245
#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_MIMO3_ABC
246
247
/*FIXME:RS:add possible actions for MIMO3*/
248
249
#define IWL_ACTION_LIMIT 3
/* # possible actions */
250
251
#define LQ_SIZE 2
/* 2 mode tables: "Active" and "Search" */
252
253
/* load per tid defines for A-MPDU activation */
254
#define IWL_AGG_TPT_THREHOLD 0
255
#define IWL_AGG_LOAD_THRESHOLD 10
256
#define IWL_AGG_ALL_TID 0xff
257
#define TID_QUEUE_CELL_SPACING 50
/*mS */
258
#define TID_QUEUE_MAX_SIZE 20
259
#define TID_ROUND_VALUE 5
/* mS */
260
261
#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING)
262
#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
263
264
extern
const
struct
iwl_rate_info
iwl_rates
[
IWL_RATE_COUNT
];
265
266
enum
iwl_table_type
{
267
LQ_NONE
,
268
LQ_G
,
/* legacy types */
269
LQ_A
,
270
LQ_SISO
,
/* high-throughput types */
271
LQ_MIMO2
,
272
LQ_MIMO3
,
273
LQ_MAX
,
274
};
275
276
#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A))
277
#define is_siso(tbl) ((tbl) == LQ_SISO)
278
#define is_mimo2(tbl) ((tbl) == LQ_MIMO2)
279
#define is_mimo3(tbl) ((tbl) == LQ_MIMO3)
280
#define is_mimo(tbl) (is_mimo2(tbl) || is_mimo3(tbl))
281
#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl))
282
#define is_a_band(tbl) ((tbl) == LQ_A)
283
#define is_g_and(tbl) ((tbl) == LQ_G)
284
285
#define IWL_MAX_MCS_DISPLAY_SIZE 12
286
287
struct
iwl_rate_mcs_info
{
288
char
mbps
[
IWL_MAX_MCS_DISPLAY_SIZE
];
289
char
mcs
[
IWL_MAX_MCS_DISPLAY_SIZE
];
290
};
291
295
struct
iwl_rate_scale_data
{
296
u64
data
;
/* bitmap of successful frames */
297
s32
success_counter
;
/* number of frames successful */
298
s32
success_ratio
;
/* per-cent * 128 */
299
s32
counter
;
/* number of frames attempted */
300
s32
average_tpt
;
/* success ratio * expected throughput */
301
unsigned
long
stamp
;
302
};
303
310
struct
iwl_scale_tbl_info
{
311
enum
iwl_table_type
lq_type
;
312
u8
ant_type
;
313
u8
is_SGI
;
/* 1 = short guard interval */
314
u8
is_ht40
;
/* 1 = 40 MHz channel width */
315
u8
is_dup
;
/* 1 = duplicated data streams */
316
u8
action
;
/* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */
317
u8
max_search
;
/* maximun number of tables we can search */
318
s32
*
expected_tpt
;
/* throughput metrics; expected_tpt_G, etc. */
319
u32
current_rate
;
/* rate_n_flags, uCode API format */
320
struct
iwl_rate_scale_data
win
[
IWL_RATE_COUNT
];
/* rate histories */
321
};
322
323
struct
iwl_traffic_load
{
324
unsigned
long
time_stamp
;
/* age of the oldest statistics */
325
u32
packet_count
[
TID_QUEUE_MAX_SIZE
];
/* packet count in this time
326
* slice */
327
u32
total
;
/* total num of packets during the
328
* last TID_MAX_TIME_DIFF */
329
u8
queue_count
;
/* number of queues that has
330
* been used since the last cleanup */
331
u8
head
;
/* start of the circular buffer */
332
};
333
339
struct
iwl_lq_sta
{
340
u8
active_tbl
;
/* index of active table, range 0-1 */
341
u8
enable_counter
;
/* indicates HT mode */
342
u8
stay_in_tbl
;
/* 1: disallow, 0: allow search for new mode */
343
u8
search_better_tbl
;
/* 1: currently trying alternate mode */
344
s32
last_tpt
;
345
346
/* The following determine when to search for a new mode */
347
u32
table_count_limit
;
348
u32
max_failure_limit
;
/* # failed frames before new search */
349
u32
max_success_limit
;
/* # successful frames before new search */
350
u32
table_count
;
351
u32
total_failed
;
/* total failed frames, any/all rates */
352
u32
total_success
;
/* total successful frames, any/all rates */
353
u64
flush_timer
;
/* time staying in mode before new search */
354
355
u8
action_counter
;
/* # mode-switch actions tried */
356
u8
is_green
;
357
u8
is_dup
;
358
enum
ieee80211_band
band
;
359
360
/* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */
361
u32
supp_rates
;
362
u16
active_legacy_rate
;
363
u16
active_siso_rate
;
364
u16
active_mimo2_rate
;
365
u16
active_mimo3_rate
;
366
s8
max_rate_idx
;
/* Max rate set by user */
367
u8
missed_rate_counter
;
368
369
struct
iwl_link_quality_cmd
lq
;
370
struct
iwl_scale_tbl_info
lq_info
[
LQ_SIZE
];
/* "active", "search" */
371
struct
iwl_traffic_load
load
[
IWL_MAX_TID_COUNT
];
372
u8
tx_agg_tid_en
;
373
#ifdef CONFIG_MAC80211_DEBUGFS
374
struct
dentry
*rs_sta_dbgfs_scale_table_file;
375
struct
dentry
*rs_sta_dbgfs_stats_table_file;
376
struct
dentry
*rs_sta_dbgfs_rate_scale_data_file;
377
struct
dentry
*rs_sta_dbgfs_tx_agg_tid_en_file;
378
u32
dbg_fixed_rate;
379
#endif
380
struct
iwl_priv
*
drv
;
381
382
/* used to be in sta_info */
383
int
last_txrate_idx
;
384
/* last tx rate_n_flags */
385
u32
last_rate_n_flags
;
386
/* packets destined for this STA are aggregated */
387
u8
is_agg
;
388
/* BT traffic this sta was last updated in */
389
u8
last_bt_traffic
;
390
};
391
392
static
inline
u8
num_of_ant(
u8
mask
)
393
{
394
return
!!((
mask
) &
ANT_A
) +
395
!!((
mask
) &
ANT_B
) +
396
!!((
mask
) &
ANT_C
);
397
}
398
399
static
inline
u8
first_antenna(
u8
mask
)
400
{
401
if
(mask &
ANT_A
)
402
return
ANT_A
;
403
if
(mask &
ANT_B
)
404
return
ANT_B
;
405
return
ANT_C
;
406
}
407
408
409
/* Initialize station's rate scaling information after adding station */
410
extern
void
iwl_rs_rate_init
(
struct
iwl_priv
*
priv
,
411
struct
ieee80211_sta
*sta,
u8
sta_id);
412
423
extern
int
iwlagn_rate_control_register
(
void
);
424
431
extern
void
iwlagn_rate_control_unregister
(
void
);
432
433
#endif
/* __iwl_agn__rs__ */
Generated on Thu Jan 10 2013 14:11:45 for Linux Kernel by
1.8.2