Commit | Line | Data |
---|---|---|
b481de9c ZY |
1 | /****************************************************************************** |
2 | * | |
3 | * Copyright(c) 2005 - 2007 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 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | |
24 | * | |
25 | *****************************************************************************/ | |
26 | ||
27 | #ifndef __iwl_3945_rs_h__ | |
28 | #define __iwl_3945_rs_h__ | |
29 | ||
bb8c093b | 30 | struct iwl3945_rate_info { |
b481de9c ZY |
31 | u8 plcp; |
32 | u8 ieee; | |
33 | u8 prev_ieee; /* previous rate in IEEE speeds */ | |
34 | u8 next_ieee; /* next rate in IEEE speeds */ | |
35 | u8 prev_rs; /* previous rate used in rs algo */ | |
36 | u8 next_rs; /* next rate used in rs algo */ | |
37 | u8 prev_rs_tgg; /* previous rate used in TGG rs algo */ | |
38 | u8 next_rs_tgg; /* next rate used in TGG rs algo */ | |
14577f23 MA |
39 | u8 table_rs_index; /* index in rate scale table cmd */ |
40 | u8 prev_table_rs; /* prev in rate table cmd */ | |
41 | ||
b481de9c ZY |
42 | }; |
43 | ||
44 | enum { | |
14577f23 MA |
45 | IWL_RATE_1M_INDEX = 0, |
46 | IWL_RATE_2M_INDEX, | |
47 | IWL_RATE_5M_INDEX, | |
48 | IWL_RATE_11M_INDEX, | |
49 | IWL_RATE_6M_INDEX, | |
b481de9c ZY |
50 | IWL_RATE_9M_INDEX, |
51 | IWL_RATE_12M_INDEX, | |
52 | IWL_RATE_18M_INDEX, | |
53 | IWL_RATE_24M_INDEX, | |
54 | IWL_RATE_36M_INDEX, | |
55 | IWL_RATE_48M_INDEX, | |
56 | IWL_RATE_54M_INDEX, | |
b481de9c ZY |
57 | IWL_RATE_COUNT, |
58 | IWL_RATE_INVM_INDEX, | |
59 | IWL_RATE_INVALID = IWL_RATE_INVM_INDEX | |
60 | }; | |
61 | ||
14577f23 MA |
62 | enum { |
63 | IWL_RATE_6M_INDEX_TABLE = 0, | |
64 | IWL_RATE_9M_INDEX_TABLE, | |
65 | IWL_RATE_12M_INDEX_TABLE, | |
66 | IWL_RATE_18M_INDEX_TABLE, | |
67 | IWL_RATE_24M_INDEX_TABLE, | |
68 | IWL_RATE_36M_INDEX_TABLE, | |
69 | IWL_RATE_48M_INDEX_TABLE, | |
70 | IWL_RATE_54M_INDEX_TABLE, | |
71 | IWL_RATE_1M_INDEX_TABLE, | |
72 | IWL_RATE_2M_INDEX_TABLE, | |
73 | IWL_RATE_5M_INDEX_TABLE, | |
74 | IWL_RATE_11M_INDEX_TABLE, | |
75 | IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX, | |
76 | }; | |
77 | ||
b481de9c ZY |
78 | enum { |
79 | IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX, | |
80 | IWL_LAST_OFDM_RATE = IWL_RATE_54M_INDEX, | |
81 | IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX, | |
82 | IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX, | |
83 | }; | |
84 | ||
85 | /* #define vs. enum to keep from defaulting to 'large integer' */ | |
86 | #define IWL_RATE_6M_MASK (1<<IWL_RATE_6M_INDEX) | |
87 | #define IWL_RATE_9M_MASK (1<<IWL_RATE_9M_INDEX) | |
88 | #define IWL_RATE_12M_MASK (1<<IWL_RATE_12M_INDEX) | |
89 | #define IWL_RATE_18M_MASK (1<<IWL_RATE_18M_INDEX) | |
90 | #define IWL_RATE_24M_MASK (1<<IWL_RATE_24M_INDEX) | |
91 | #define IWL_RATE_36M_MASK (1<<IWL_RATE_36M_INDEX) | |
92 | #define IWL_RATE_48M_MASK (1<<IWL_RATE_48M_INDEX) | |
93 | #define IWL_RATE_54M_MASK (1<<IWL_RATE_54M_INDEX) | |
94 | #define IWL_RATE_1M_MASK (1<<IWL_RATE_1M_INDEX) | |
95 | #define IWL_RATE_2M_MASK (1<<IWL_RATE_2M_INDEX) | |
96 | #define IWL_RATE_5M_MASK (1<<IWL_RATE_5M_INDEX) | |
97 | #define IWL_RATE_11M_MASK (1<<IWL_RATE_11M_INDEX) | |
98 | ||
99 | enum { | |
100 | IWL_RATE_6M_PLCP = 13, | |
101 | IWL_RATE_9M_PLCP = 15, | |
102 | IWL_RATE_12M_PLCP = 5, | |
103 | IWL_RATE_18M_PLCP = 7, | |
104 | IWL_RATE_24M_PLCP = 9, | |
105 | IWL_RATE_36M_PLCP = 11, | |
106 | IWL_RATE_48M_PLCP = 1, | |
107 | IWL_RATE_54M_PLCP = 3, | |
108 | IWL_RATE_1M_PLCP = 10, | |
109 | IWL_RATE_2M_PLCP = 20, | |
110 | IWL_RATE_5M_PLCP = 55, | |
111 | IWL_RATE_11M_PLCP = 110, | |
112 | }; | |
113 | ||
114 | enum { | |
115 | IWL_RATE_6M_IEEE = 12, | |
116 | IWL_RATE_9M_IEEE = 18, | |
117 | IWL_RATE_12M_IEEE = 24, | |
118 | IWL_RATE_18M_IEEE = 36, | |
119 | IWL_RATE_24M_IEEE = 48, | |
120 | IWL_RATE_36M_IEEE = 72, | |
121 | IWL_RATE_48M_IEEE = 96, | |
122 | IWL_RATE_54M_IEEE = 108, | |
123 | IWL_RATE_1M_IEEE = 2, | |
124 | IWL_RATE_2M_IEEE = 4, | |
125 | IWL_RATE_5M_IEEE = 11, | |
126 | IWL_RATE_11M_IEEE = 22, | |
127 | }; | |
128 | ||
129 | #define IWL_CCK_BASIC_RATES_MASK \ | |
130 | (IWL_RATE_1M_MASK | \ | |
131 | IWL_RATE_2M_MASK) | |
132 | ||
133 | #define IWL_CCK_RATES_MASK \ | |
134 | (IWL_BASIC_RATES_MASK | \ | |
135 | IWL_RATE_5M_MASK | \ | |
136 | IWL_RATE_11M_MASK) | |
137 | ||
138 | #define IWL_OFDM_BASIC_RATES_MASK \ | |
139 | (IWL_RATE_6M_MASK | \ | |
140 | IWL_RATE_12M_MASK | \ | |
141 | IWL_RATE_24M_MASK) | |
142 | ||
143 | #define IWL_OFDM_RATES_MASK \ | |
144 | (IWL_OFDM_BASIC_RATES_MASK | \ | |
145 | IWL_RATE_9M_MASK | \ | |
146 | IWL_RATE_18M_MASK | \ | |
147 | IWL_RATE_36M_MASK | \ | |
148 | IWL_RATE_48M_MASK | \ | |
149 | IWL_RATE_54M_MASK) | |
150 | ||
151 | #define IWL_BASIC_RATES_MASK \ | |
152 | (IWL_OFDM_BASIC_RATES_MASK | \ | |
153 | IWL_CCK_BASIC_RATES_MASK) | |
154 | ||
155 | #define IWL_RATES_MASK ((1<<IWL_RATE_COUNT)-1) | |
156 | ||
157 | #define IWL_INVALID_VALUE -1 | |
158 | ||
159 | #define IWL_MIN_RSSI_VAL -100 | |
160 | #define IWL_MAX_RSSI_VAL 0 | |
161 | ||
bb8c093b | 162 | extern const struct iwl3945_rate_info iwl3945_rates[IWL_RATE_COUNT]; |
b481de9c | 163 | |
bb8c093b | 164 | static inline u8 iwl3945_get_prev_ieee_rate(u8 rate_index) |
b481de9c | 165 | { |
bb8c093b | 166 | u8 rate = iwl3945_rates[rate_index].prev_ieee; |
b481de9c ZY |
167 | |
168 | if (rate == IWL_RATE_INVALID) | |
169 | rate = rate_index; | |
170 | return rate; | |
171 | } | |
172 | ||
173 | /** | |
bb8c093b | 174 | * iwl3945_fill_rs_info - Fill an output text buffer with the rate representation |
b481de9c ZY |
175 | * |
176 | * NOTE: This is provided as a quick mechanism for a user to visualize | |
01ebd063 | 177 | * the performance of the rate control algorithm and is not meant to be |
b481de9c ZY |
178 | * parsed software. |
179 | */ | |
bb8c093b | 180 | extern int iwl3945_fill_rs_info(struct ieee80211_hw *, char *buf, u8 sta_id); |
b481de9c ZY |
181 | |
182 | /** | |
bb8c093b | 183 | * iwl3945_rate_scale_init - Initialize the rate scale table based on assoc info |
b481de9c | 184 | * |
01ebd063 | 185 | * The specific throughput table used is based on the type of network |
b481de9c ZY |
186 | * the associated with, including A, B, G, and G w/ TGG protection |
187 | */ | |
bb8c093b | 188 | extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id); |
b481de9c ZY |
189 | |
190 | /** | |
bb8c093b | 191 | * iwl3945_rate_control_register - Register the rate control algorithm callbacks |
b481de9c ZY |
192 | * |
193 | * Since the rate control algorithm is hardware specific, there is no need | |
194 | * or reason to place it as a stand alone module. The driver can call | |
bb8c093b | 195 | * iwl3945_rate_control_register in order to register the rate control callbacks |
b481de9c ZY |
196 | * with the mac80211 subsystem. This should be performed prior to calling |
197 | * ieee80211_register_hw | |
198 | * | |
199 | */ | |
bb8c093b | 200 | extern void iwl3945_rate_control_register(struct ieee80211_hw *hw); |
b481de9c ZY |
201 | |
202 | /** | |
bb8c093b | 203 | * iwl3945_rate_control_unregister - Unregister the rate control callbacks |
b481de9c ZY |
204 | * |
205 | * This should be called after calling ieee80211_unregister_hw, but before | |
206 | * the driver is unloaded. | |
207 | */ | |
bb8c093b | 208 | extern void iwl3945_rate_control_unregister(struct ieee80211_hw *hw); |
b481de9c ZY |
209 | |
210 | #endif |