0001
0002
0003
0004
0005
0006
0007 #ifndef __iwl_agn_rs_h__
0008 #define __iwl_agn_rs_h__
0009
0010 #include <net/mac80211.h>
0011
0012 #include "iwl-config.h"
0013
0014 #include "commands.h"
0015
0016 struct iwl_rate_info {
0017 u8 plcp;
0018 u8 plcp_siso;
0019 u8 plcp_mimo2;
0020 u8 plcp_mimo3;
0021 u8 ieee;
0022 u8 prev_ieee;
0023 u8 next_ieee;
0024 u8 prev_rs;
0025 u8 next_rs;
0026 u8 prev_rs_tgg;
0027 u8 next_rs_tgg;
0028 };
0029
0030
0031
0032
0033
0034 enum {
0035 IWL_RATE_1M_INDEX = 0,
0036 IWL_RATE_2M_INDEX,
0037 IWL_RATE_5M_INDEX,
0038 IWL_RATE_11M_INDEX,
0039 IWL_RATE_6M_INDEX,
0040 IWL_RATE_9M_INDEX,
0041 IWL_RATE_12M_INDEX,
0042 IWL_RATE_18M_INDEX,
0043 IWL_RATE_24M_INDEX,
0044 IWL_RATE_36M_INDEX,
0045 IWL_RATE_48M_INDEX,
0046 IWL_RATE_54M_INDEX,
0047 IWL_RATE_60M_INDEX,
0048 IWL_RATE_COUNT,
0049 IWL_RATE_COUNT_LEGACY = IWL_RATE_COUNT - 1,
0050 IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
0051 IWL_RATE_INVALID = IWL_RATE_COUNT,
0052 };
0053
0054 enum {
0055 IWL_RATE_6M_INDEX_TABLE = 0,
0056 IWL_RATE_9M_INDEX_TABLE,
0057 IWL_RATE_12M_INDEX_TABLE,
0058 IWL_RATE_18M_INDEX_TABLE,
0059 IWL_RATE_24M_INDEX_TABLE,
0060 IWL_RATE_36M_INDEX_TABLE,
0061 IWL_RATE_48M_INDEX_TABLE,
0062 IWL_RATE_54M_INDEX_TABLE,
0063 IWL_RATE_1M_INDEX_TABLE,
0064 IWL_RATE_2M_INDEX_TABLE,
0065 IWL_RATE_5M_INDEX_TABLE,
0066 IWL_RATE_11M_INDEX_TABLE,
0067 IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX - 1,
0068 };
0069
0070 enum {
0071 IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
0072 IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX,
0073 IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
0074 IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
0075 };
0076
0077
0078 #define IWL_RATE_6M_MASK (1 << IWL_RATE_6M_INDEX)
0079 #define IWL_RATE_9M_MASK (1 << IWL_RATE_9M_INDEX)
0080 #define IWL_RATE_12M_MASK (1 << IWL_RATE_12M_INDEX)
0081 #define IWL_RATE_18M_MASK (1 << IWL_RATE_18M_INDEX)
0082 #define IWL_RATE_24M_MASK (1 << IWL_RATE_24M_INDEX)
0083 #define IWL_RATE_36M_MASK (1 << IWL_RATE_36M_INDEX)
0084 #define IWL_RATE_48M_MASK (1 << IWL_RATE_48M_INDEX)
0085 #define IWL_RATE_54M_MASK (1 << IWL_RATE_54M_INDEX)
0086 #define IWL_RATE_60M_MASK (1 << IWL_RATE_60M_INDEX)
0087 #define IWL_RATE_1M_MASK (1 << IWL_RATE_1M_INDEX)
0088 #define IWL_RATE_2M_MASK (1 << IWL_RATE_2M_INDEX)
0089 #define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX)
0090 #define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX)
0091
0092
0093 enum {
0094 IWL_RATE_6M_PLCP = 13,
0095 IWL_RATE_9M_PLCP = 15,
0096 IWL_RATE_12M_PLCP = 5,
0097 IWL_RATE_18M_PLCP = 7,
0098 IWL_RATE_24M_PLCP = 9,
0099 IWL_RATE_36M_PLCP = 11,
0100 IWL_RATE_48M_PLCP = 1,
0101 IWL_RATE_54M_PLCP = 3,
0102 IWL_RATE_60M_PLCP = 3,
0103 IWL_RATE_1M_PLCP = 10,
0104 IWL_RATE_2M_PLCP = 20,
0105 IWL_RATE_5M_PLCP = 55,
0106 IWL_RATE_11M_PLCP = 110,
0107
0108
0109 };
0110
0111
0112 enum {
0113 IWL_RATE_SISO_6M_PLCP = 0,
0114 IWL_RATE_SISO_12M_PLCP = 1,
0115 IWL_RATE_SISO_18M_PLCP = 2,
0116 IWL_RATE_SISO_24M_PLCP = 3,
0117 IWL_RATE_SISO_36M_PLCP = 4,
0118 IWL_RATE_SISO_48M_PLCP = 5,
0119 IWL_RATE_SISO_54M_PLCP = 6,
0120 IWL_RATE_SISO_60M_PLCP = 7,
0121 IWL_RATE_MIMO2_6M_PLCP = 0x8,
0122 IWL_RATE_MIMO2_12M_PLCP = 0x9,
0123 IWL_RATE_MIMO2_18M_PLCP = 0xa,
0124 IWL_RATE_MIMO2_24M_PLCP = 0xb,
0125 IWL_RATE_MIMO2_36M_PLCP = 0xc,
0126 IWL_RATE_MIMO2_48M_PLCP = 0xd,
0127 IWL_RATE_MIMO2_54M_PLCP = 0xe,
0128 IWL_RATE_MIMO2_60M_PLCP = 0xf,
0129 IWL_RATE_MIMO3_6M_PLCP = 0x10,
0130 IWL_RATE_MIMO3_12M_PLCP = 0x11,
0131 IWL_RATE_MIMO3_18M_PLCP = 0x12,
0132 IWL_RATE_MIMO3_24M_PLCP = 0x13,
0133 IWL_RATE_MIMO3_36M_PLCP = 0x14,
0134 IWL_RATE_MIMO3_48M_PLCP = 0x15,
0135 IWL_RATE_MIMO3_54M_PLCP = 0x16,
0136 IWL_RATE_MIMO3_60M_PLCP = 0x17,
0137 IWL_RATE_SISO_INVM_PLCP,
0138 IWL_RATE_MIMO2_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
0139 IWL_RATE_MIMO3_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
0140 };
0141
0142
0143 enum {
0144 IWL_RATE_6M_IEEE = 12,
0145 IWL_RATE_9M_IEEE = 18,
0146 IWL_RATE_12M_IEEE = 24,
0147 IWL_RATE_18M_IEEE = 36,
0148 IWL_RATE_24M_IEEE = 48,
0149 IWL_RATE_36M_IEEE = 72,
0150 IWL_RATE_48M_IEEE = 96,
0151 IWL_RATE_54M_IEEE = 108,
0152 IWL_RATE_60M_IEEE = 120,
0153 IWL_RATE_1M_IEEE = 2,
0154 IWL_RATE_2M_IEEE = 4,
0155 IWL_RATE_5M_IEEE = 11,
0156 IWL_RATE_11M_IEEE = 22,
0157 };
0158
0159 #define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
0160
0161 #define IWL_INVALID_VALUE -1
0162
0163 #define IWL_MIN_RSSI_VAL -100
0164 #define IWL_MAX_RSSI_VAL 0
0165
0166
0167
0168 #define IWL_LEGACY_FAILURE_LIMIT 160
0169 #define IWL_LEGACY_SUCCESS_LIMIT 480
0170 #define IWL_LEGACY_TABLE_COUNT 160
0171
0172 #define IWL_NONE_LEGACY_FAILURE_LIMIT 400
0173 #define IWL_NONE_LEGACY_SUCCESS_LIMIT 4500
0174 #define IWL_NONE_LEGACY_TABLE_COUNT 1500
0175
0176
0177 #define IWL_RS_GOOD_RATIO 12800
0178 #define IWL_RATE_SCALE_SWITCH 10880
0179 #define IWL_RATE_HIGH_TH 10880
0180 #define IWL_RATE_INCREASE_TH 6400
0181 #define IWL_RATE_DECREASE_TH 1920
0182
0183
0184 #define IWL_LEGACY_SWITCH_ANTENNA1 0
0185 #define IWL_LEGACY_SWITCH_ANTENNA2 1
0186 #define IWL_LEGACY_SWITCH_SISO 2
0187 #define IWL_LEGACY_SWITCH_MIMO2_AB 3
0188 #define IWL_LEGACY_SWITCH_MIMO2_AC 4
0189 #define IWL_LEGACY_SWITCH_MIMO2_BC 5
0190 #define IWL_LEGACY_SWITCH_MIMO3_ABC 6
0191
0192
0193 #define IWL_SISO_SWITCH_ANTENNA1 0
0194 #define IWL_SISO_SWITCH_ANTENNA2 1
0195 #define IWL_SISO_SWITCH_MIMO2_AB 2
0196 #define IWL_SISO_SWITCH_MIMO2_AC 3
0197 #define IWL_SISO_SWITCH_MIMO2_BC 4
0198 #define IWL_SISO_SWITCH_GI 5
0199 #define IWL_SISO_SWITCH_MIMO3_ABC 6
0200
0201
0202
0203 #define IWL_MIMO2_SWITCH_ANTENNA1 0
0204 #define IWL_MIMO2_SWITCH_ANTENNA2 1
0205 #define IWL_MIMO2_SWITCH_SISO_A 2
0206 #define IWL_MIMO2_SWITCH_SISO_B 3
0207 #define IWL_MIMO2_SWITCH_SISO_C 4
0208 #define IWL_MIMO2_SWITCH_GI 5
0209 #define IWL_MIMO2_SWITCH_MIMO3_ABC 6
0210
0211
0212
0213 #define IWL_MIMO3_SWITCH_ANTENNA1 0
0214 #define IWL_MIMO3_SWITCH_ANTENNA2 1
0215 #define IWL_MIMO3_SWITCH_SISO_A 2
0216 #define IWL_MIMO3_SWITCH_SISO_B 3
0217 #define IWL_MIMO3_SWITCH_SISO_C 4
0218 #define IWL_MIMO3_SWITCH_MIMO2_AB 5
0219 #define IWL_MIMO3_SWITCH_MIMO2_AC 6
0220 #define IWL_MIMO3_SWITCH_MIMO2_BC 7
0221 #define IWL_MIMO3_SWITCH_GI 8
0222
0223
0224 #define IWL_MAX_11N_MIMO3_SEARCH IWL_MIMO3_SWITCH_GI
0225 #define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_MIMO3_ABC
0226
0227
0228
0229 #define IWL_ACTION_LIMIT 3
0230
0231 #define LQ_SIZE 2
0232
0233
0234 #define IWL_AGG_TPT_THREHOLD 0
0235 #define IWL_AGG_LOAD_THRESHOLD 10
0236 #define IWL_AGG_ALL_TID 0xff
0237 #define TID_QUEUE_CELL_SPACING 50
0238 #define TID_QUEUE_MAX_SIZE 20
0239 #define TID_ROUND_VALUE 5
0240
0241 #define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING)
0242 #define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
0243
0244 extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
0245
0246 enum iwl_table_type {
0247 LQ_NONE,
0248 LQ_G,
0249 LQ_A,
0250 LQ_SISO,
0251 LQ_MIMO2,
0252 LQ_MIMO3,
0253 LQ_MAX,
0254 };
0255
0256 #define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A))
0257 #define is_siso(tbl) ((tbl) == LQ_SISO)
0258 #define is_mimo2(tbl) ((tbl) == LQ_MIMO2)
0259 #define is_mimo3(tbl) ((tbl) == LQ_MIMO3)
0260 #define is_mimo(tbl) (is_mimo2(tbl) || is_mimo3(tbl))
0261 #define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl))
0262 #define is_a_band(tbl) ((tbl) == LQ_A)
0263 #define is_g_and(tbl) ((tbl) == LQ_G)
0264
0265 #define IWL_MAX_MCS_DISPLAY_SIZE 12
0266
0267 struct iwl_rate_mcs_info {
0268 char mbps[IWL_MAX_MCS_DISPLAY_SIZE];
0269 char mcs[IWL_MAX_MCS_DISPLAY_SIZE];
0270 };
0271
0272
0273
0274
0275 struct iwl_rate_scale_data {
0276 u64 data;
0277 s32 success_counter;
0278 s32 success_ratio;
0279 s32 counter;
0280 s32 average_tpt;
0281 unsigned long stamp;
0282 };
0283
0284
0285
0286
0287
0288
0289
0290 struct iwl_scale_tbl_info {
0291 enum iwl_table_type lq_type;
0292 u8 ant_type;
0293 u8 is_SGI;
0294 u8 is_ht40;
0295 u8 is_dup;
0296 u8 action;
0297 u8 max_search;
0298 const u16 *expected_tpt;
0299 u32 current_rate;
0300 struct iwl_rate_scale_data win[IWL_RATE_COUNT];
0301 };
0302
0303 struct iwl_traffic_load {
0304 unsigned long time_stamp;
0305 u32 packet_count[TID_QUEUE_MAX_SIZE];
0306
0307 u32 total;
0308
0309 u8 queue_count;
0310
0311 u8 head;
0312 };
0313
0314
0315
0316
0317
0318
0319 struct iwl_lq_sta {
0320 u8 active_tbl;
0321 u8 enable_counter;
0322 u8 stay_in_tbl;
0323 u8 search_better_tbl;
0324 s32 last_tpt;
0325
0326
0327 u32 table_count_limit;
0328 u32 max_failure_limit;
0329 u32 max_success_limit;
0330 u32 table_count;
0331 u32 total_failed;
0332 u32 total_success;
0333 u64 flush_timer;
0334
0335 u8 action_counter;
0336 u8 is_green;
0337 u8 is_dup;
0338 enum nl80211_band band;
0339
0340
0341 u32 supp_rates;
0342 u16 active_legacy_rate;
0343 u16 active_siso_rate;
0344 u16 active_mimo2_rate;
0345 u16 active_mimo3_rate;
0346 s8 max_rate_idx;
0347 u8 missed_rate_counter;
0348
0349 struct iwl_link_quality_cmd lq;
0350 struct iwl_scale_tbl_info lq_info[LQ_SIZE];
0351 struct iwl_traffic_load load[IWL_MAX_TID_COUNT];
0352 u8 tx_agg_tid_en;
0353 #ifdef CONFIG_MAC80211_DEBUGFS
0354 u32 dbg_fixed_rate;
0355 #endif
0356 struct iwl_priv *drv;
0357
0358
0359 int last_txrate_idx;
0360
0361 u32 last_rate_n_flags;
0362
0363 u8 is_agg;
0364
0365 u8 last_bt_traffic;
0366 };
0367
0368 static inline u8 first_antenna(u8 mask)
0369 {
0370 if (mask & ANT_A)
0371 return ANT_A;
0372 if (mask & ANT_B)
0373 return ANT_B;
0374 return ANT_C;
0375 }
0376
0377
0378
0379 void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta,
0380 u8 sta_id);
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392 int iwlagn_rate_control_register(void);
0393
0394
0395
0396
0397
0398
0399
0400 void iwlagn_rate_control_unregister(void);
0401
0402 #endif