diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 100 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.h | 101 |
2 files changed, 101 insertions, 100 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index a07be29cc5e5..2d4ec1a65957 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -75,106 +75,6 @@ static const u8 ant_toggle_lookup[] = { | |||
75 | /*ANT_ABC -> */ ANT_ABC, | 75 | /*ANT_ABC -> */ ANT_ABC, |
76 | }; | 76 | }; |
77 | 77 | ||
78 | /** | ||
79 | * struct iwl_rate_scale_data -- tx success history for one rate | ||
80 | */ | ||
81 | struct iwl_rate_scale_data { | ||
82 | u64 data; /* bitmap of successful frames */ | ||
83 | s32 success_counter; /* number of frames successful */ | ||
84 | s32 success_ratio; /* per-cent * 128 */ | ||
85 | s32 counter; /* number of frames attempted */ | ||
86 | s32 average_tpt; /* success ratio * expected throughput */ | ||
87 | unsigned long stamp; | ||
88 | }; | ||
89 | |||
90 | /** | ||
91 | * struct iwl_scale_tbl_info -- tx params and success history for all rates | ||
92 | * | ||
93 | * There are two of these in struct iwl_lq_sta, | ||
94 | * one for "active", and one for "search". | ||
95 | */ | ||
96 | struct iwl_scale_tbl_info { | ||
97 | enum iwl_table_type lq_type; | ||
98 | u8 ant_type; | ||
99 | u8 is_SGI; /* 1 = short guard interval */ | ||
100 | u8 is_ht40; /* 1 = 40 MHz channel width */ | ||
101 | u8 is_dup; /* 1 = duplicated data streams */ | ||
102 | u8 action; /* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */ | ||
103 | u8 max_search; /* maximun number of tables we can search */ | ||
104 | s32 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ | ||
105 | u32 current_rate; /* rate_n_flags, uCode API format */ | ||
106 | struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */ | ||
107 | }; | ||
108 | |||
109 | struct iwl_traffic_load { | ||
110 | unsigned long time_stamp; /* age of the oldest statistics */ | ||
111 | u32 packet_count[TID_QUEUE_MAX_SIZE]; /* packet count in this time | ||
112 | * slice */ | ||
113 | u32 total; /* total num of packets during the | ||
114 | * last TID_MAX_TIME_DIFF */ | ||
115 | u8 queue_count; /* number of queues that has | ||
116 | * been used since the last cleanup */ | ||
117 | u8 head; /* start of the circular buffer */ | ||
118 | }; | ||
119 | |||
120 | /** | ||
121 | * struct iwl_lq_sta -- driver's rate scaling private structure | ||
122 | * | ||
123 | * Pointer to this gets passed back and forth between driver and mac80211. | ||
124 | */ | ||
125 | struct iwl_lq_sta { | ||
126 | u8 active_tbl; /* index of active table, range 0-1 */ | ||
127 | u8 enable_counter; /* indicates HT mode */ | ||
128 | u8 stay_in_tbl; /* 1: disallow, 0: allow search for new mode */ | ||
129 | u8 search_better_tbl; /* 1: currently trying alternate mode */ | ||
130 | s32 last_tpt; | ||
131 | |||
132 | /* The following determine when to search for a new mode */ | ||
133 | u32 table_count_limit; | ||
134 | u32 max_failure_limit; /* # failed frames before new search */ | ||
135 | u32 max_success_limit; /* # successful frames before new search */ | ||
136 | u32 table_count; | ||
137 | u32 total_failed; /* total failed frames, any/all rates */ | ||
138 | u32 total_success; /* total successful frames, any/all rates */ | ||
139 | u64 flush_timer; /* time staying in mode before new search */ | ||
140 | |||
141 | u8 action_counter; /* # mode-switch actions tried */ | ||
142 | u8 is_green; | ||
143 | u8 is_dup; | ||
144 | enum ieee80211_band band; | ||
145 | u8 ibss_sta_added; | ||
146 | |||
147 | /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */ | ||
148 | u32 supp_rates; | ||
149 | u16 active_legacy_rate; | ||
150 | u16 active_siso_rate; | ||
151 | u16 active_mimo2_rate; | ||
152 | u16 active_mimo3_rate; | ||
153 | u16 active_rate_basic; | ||
154 | s8 max_rate_idx; /* Max rate set by user */ | ||
155 | u8 missed_rate_counter; | ||
156 | |||
157 | struct iwl_link_quality_cmd lq; | ||
158 | struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ | ||
159 | struct iwl_traffic_load load[TID_MAX_LOAD_COUNT]; | ||
160 | u8 tx_agg_tid_en; | ||
161 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
162 | struct dentry *rs_sta_dbgfs_scale_table_file; | ||
163 | struct dentry *rs_sta_dbgfs_stats_table_file; | ||
164 | struct dentry *rs_sta_dbgfs_rate_scale_data_file; | ||
165 | struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file; | ||
166 | u32 dbg_fixed_rate; | ||
167 | #endif | ||
168 | struct iwl_priv *drv; | ||
169 | |||
170 | /* used to be in sta_info */ | ||
171 | int last_txrate_idx; | ||
172 | /* last tx rate_n_flags */ | ||
173 | u32 last_rate_n_flags; | ||
174 | /* packets destined for this STA are aggregated */ | ||
175 | u8 is_agg; | ||
176 | }; | ||
177 | |||
178 | static void rs_rate_scale_perform(struct iwl_priv *priv, | 78 | static void rs_rate_scale_perform(struct iwl_priv *priv, |
179 | struct sk_buff *skb, | 79 | struct sk_buff *skb, |
180 | struct ieee80211_sta *sta, | 80 | struct ieee80211_sta *sta, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.h b/drivers/net/wireless/iwlwifi/iwl-agn-rs.h index 9fac530cfb7e..affc0c5a2f2c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.h +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.h | |||
@@ -54,6 +54,7 @@ struct iwl3945_rate_info { | |||
54 | u8 prev_table_rs; /* prev in rate table cmd */ | 54 | u8 prev_table_rs; /* prev in rate table cmd */ |
55 | }; | 55 | }; |
56 | 56 | ||
57 | |||
57 | /* | 58 | /* |
58 | * These serve as indexes into | 59 | * These serve as indexes into |
59 | * struct iwl_rate_info iwl_rates[IWL_RATE_COUNT]; | 60 | * struct iwl_rate_info iwl_rates[IWL_RATE_COUNT]; |
@@ -335,6 +336,106 @@ struct iwl_rate_mcs_info { | |||
335 | char mcs[IWL_MAX_MCS_DISPLAY_SIZE]; | 336 | char mcs[IWL_MAX_MCS_DISPLAY_SIZE]; |
336 | }; | 337 | }; |
337 | 338 | ||
339 | /** | ||
340 | * struct iwl_rate_scale_data -- tx success history for one rate | ||
341 | */ | ||
342 | struct iwl_rate_scale_data { | ||
343 | u64 data; /* bitmap of successful frames */ | ||
344 | s32 success_counter; /* number of frames successful */ | ||
345 | s32 success_ratio; /* per-cent * 128 */ | ||
346 | s32 counter; /* number of frames attempted */ | ||
347 | s32 average_tpt; /* success ratio * expected throughput */ | ||
348 | unsigned long stamp; | ||
349 | }; | ||
350 | |||
351 | /** | ||
352 | * struct iwl_scale_tbl_info -- tx params and success history for all rates | ||
353 | * | ||
354 | * There are two of these in struct iwl_lq_sta, | ||
355 | * one for "active", and one for "search". | ||
356 | */ | ||
357 | struct iwl_scale_tbl_info { | ||
358 | enum iwl_table_type lq_type; | ||
359 | u8 ant_type; | ||
360 | u8 is_SGI; /* 1 = short guard interval */ | ||
361 | u8 is_ht40; /* 1 = 40 MHz channel width */ | ||
362 | u8 is_dup; /* 1 = duplicated data streams */ | ||
363 | u8 action; /* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */ | ||
364 | u8 max_search; /* maximun number of tables we can search */ | ||
365 | s32 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ | ||
366 | u32 current_rate; /* rate_n_flags, uCode API format */ | ||
367 | struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */ | ||
368 | }; | ||
369 | |||
370 | struct iwl_traffic_load { | ||
371 | unsigned long time_stamp; /* age of the oldest statistics */ | ||
372 | u32 packet_count[TID_QUEUE_MAX_SIZE]; /* packet count in this time | ||
373 | * slice */ | ||
374 | u32 total; /* total num of packets during the | ||
375 | * last TID_MAX_TIME_DIFF */ | ||
376 | u8 queue_count; /* number of queues that has | ||
377 | * been used since the last cleanup */ | ||
378 | u8 head; /* start of the circular buffer */ | ||
379 | }; | ||
380 | |||
381 | /** | ||
382 | * struct iwl_lq_sta -- driver's rate scaling private structure | ||
383 | * | ||
384 | * Pointer to this gets passed back and forth between driver and mac80211. | ||
385 | */ | ||
386 | struct iwl_lq_sta { | ||
387 | u8 active_tbl; /* index of active table, range 0-1 */ | ||
388 | u8 enable_counter; /* indicates HT mode */ | ||
389 | u8 stay_in_tbl; /* 1: disallow, 0: allow search for new mode */ | ||
390 | u8 search_better_tbl; /* 1: currently trying alternate mode */ | ||
391 | s32 last_tpt; | ||
392 | |||
393 | /* The following determine when to search for a new mode */ | ||
394 | u32 table_count_limit; | ||
395 | u32 max_failure_limit; /* # failed frames before new search */ | ||
396 | u32 max_success_limit; /* # successful frames before new search */ | ||
397 | u32 table_count; | ||
398 | u32 total_failed; /* total failed frames, any/all rates */ | ||
399 | u32 total_success; /* total successful frames, any/all rates */ | ||
400 | u64 flush_timer; /* time staying in mode before new search */ | ||
401 | |||
402 | u8 action_counter; /* # mode-switch actions tried */ | ||
403 | u8 is_green; | ||
404 | u8 is_dup; | ||
405 | enum ieee80211_band band; | ||
406 | u8 ibss_sta_added; | ||
407 | |||
408 | /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */ | ||
409 | u32 supp_rates; | ||
410 | u16 active_legacy_rate; | ||
411 | u16 active_siso_rate; | ||
412 | u16 active_mimo2_rate; | ||
413 | u16 active_mimo3_rate; | ||
414 | u16 active_rate_basic; | ||
415 | s8 max_rate_idx; /* Max rate set by user */ | ||
416 | u8 missed_rate_counter; | ||
417 | |||
418 | struct iwl_link_quality_cmd lq; | ||
419 | struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ | ||
420 | struct iwl_traffic_load load[TID_MAX_LOAD_COUNT]; | ||
421 | u8 tx_agg_tid_en; | ||
422 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
423 | struct dentry *rs_sta_dbgfs_scale_table_file; | ||
424 | struct dentry *rs_sta_dbgfs_stats_table_file; | ||
425 | struct dentry *rs_sta_dbgfs_rate_scale_data_file; | ||
426 | struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file; | ||
427 | u32 dbg_fixed_rate; | ||
428 | #endif | ||
429 | struct iwl_priv *drv; | ||
430 | |||
431 | /* used to be in sta_info */ | ||
432 | int last_txrate_idx; | ||
433 | /* last tx rate_n_flags */ | ||
434 | u32 last_rate_n_flags; | ||
435 | /* packets destined for this STA are aggregated */ | ||
436 | u8 is_agg; | ||
437 | }; | ||
438 | |||
338 | static inline u8 num_of_ant(u8 mask) | 439 | static inline u8 num_of_ant(u8 mask) |
339 | { | 440 | { |
340 | return !!((mask) & ANT_A) + | 441 | return !!((mask) & ANT_A) + |