2 * Copyright (c) 2013 Qualcomm Atheros, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted (subject to the limitations in the
7 * disclaimer below) provided that the following conditions are met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the
17 * * Neither the name of Qualcomm Atheros nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
22 * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
23 * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
32 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
33 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include "ah_internal.h"
43 #define OFDM IEEE80211_T_OFDM
44 #define CCK IEEE80211_T_CCK
45 #define TURBO IEEE80211_T_TURBO
46 #define XR ATHEROS_T_XR
47 #define HT IEEE80211_T_HT
49 HAL_RATE_TABLE ar5416_11a_table = {
50 8, /* number of rates */
54 /* valid rateCode Preamble dot11Rate Rate */
55 /* 6 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 6000, 0x0b, 0x00, (0x80|12), 0 },
56 /* 9 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 9000, 0x0f, 0x00, 18, 0 },
57 /* 12 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 12000, 0x0a, 0x00, (0x80|24), 2 },
58 /* 18 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 18000, 0x0e, 0x00, 36, 2 },
59 /* 24 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 24000, 0x09, 0x00, (0x80|48), 4 },
60 /* 36 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 36000, 0x0d, 0x00, 72, 4 },
61 /* 48 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 48000, 0x08, 0x00, 96, 4 },
62 /* 54 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 54000, 0x0c, 0x00, 108, 4 }
66 HAL_RATE_TABLE ar5416_11b_table = {
67 4, /* number of rates */
71 /* valid rateCode Preamble dot11Rate Rate */
72 /* 1 Mb */ { AH_TRUE, CCK, 60, 60, 60, 1000, 0x1b, 0x00, (0x80| 2), 0 },
73 /* 2 Mb */ { AH_TRUE, CCK, 60, 60, 60, 2000, 0x1a, 0x04, (0x80| 4), 1 },
74 /* 5.5 Mb */ { AH_TRUE, CCK, 60, 60, 60, 5500, 0x19, 0x04, (0x80|11), 1 },
75 /* 11 Mb */ { AH_TRUE, CCK, 60, 60, 60, 11000, 0x18, 0x04, (0x80|22), 1 }
79 HAL_RATE_TABLE ar5416_11g_table = {
80 12, /* number of rates */
84 /* valid rateCode Preamble dot11Rate Rate */
85 /* 1 Mb */ { AH_TRUE, CCK, 60, 60, 60, 1000, 0x1b, 0x00, (0x80| 2), 0 },
86 /* 2 Mb */ { AH_TRUE, CCK, 60, 60, 60, 2000, 0x1a, 0x04, (0x80| 4), 1 },
87 /* 5.5 Mb */ { AH_TRUE, CCK, 60, 60, 60, 5500, 0x19, 0x04, (0x80|11), 2 },
88 /* 11 Mb */ { AH_TRUE, CCK, 60, 60, 60, 11000, 0x18, 0x04, (0x80|22), 3 },
89 /* Hardware workaround - remove rates 6, 9 from rate ctrl */
90 /* 6 Mb */ { AH_FALSE, OFDM, 60, 60, 60, 6000, 0x0b, 0x00, 12, 4 },
91 /* 9 Mb */ { AH_FALSE, OFDM, 60, 60, 60, 9000, 0x0f, 0x00, 18, 4 },
92 /* 12 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 12000, 0x0a, 0x00, 24, 6 },
93 /* 18 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 18000, 0x0e, 0x00, 36, 6 },
94 /* 24 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 24000, 0x09, 0x00, 48, 8 },
95 /* 36 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 36000, 0x0d, 0x00, 72, 8 },
96 /* 48 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 48000, 0x08, 0x00, 96, 8 },
97 /* 54 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 54000, 0x0c, 0x00, 108, 8 }
101 HAL_RATE_TABLE ar5416_11ng_table = {
103 28, /* number of rates */
107 /* valid rateCode Preamble dot11Rate Rate */
108 /* 1 Mb */ { AH_TRUE, CCK, 60, 60, 60, 1000, 0x1b, 0x00, (0x80| 2), 0 },
109 /* 2 Mb */ { AH_TRUE, CCK, 60, 60, 60, 2000, 0x1a, 0x04, (0x80| 4), 1 },
110 /* 5.5 Mb */ { AH_TRUE, CCK, 60, 60, 60, 5500, 0x19, 0x04, (0x80|11), 2 },
111 /* 11 Mb */ { AH_TRUE, CCK, 60, 60, 60, 11000, 0x18, 0x04, (0x80|22), 3 },
112 /* Hardware workaround - remove rates 6, 9 from rate ctrl */
113 /* 6 Mb */ { AH_FALSE, OFDM, 60, 60, 60, 6000, 0x0b, 0x00, 12, 4 },
114 /* 9 Mb */ { AH_FALSE, OFDM, 60, 60, 60, 9000, 0x0f, 0x00, 18, 4 },
115 /* 12 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 12000, 0x0a, 0x00, 24, 6 },
116 /* 18 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 18000, 0x0e, 0x00, 36, 6 },
117 /* 24 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 24000, 0x09, 0x00, 48, 8 },
118 /* 36 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 36000, 0x0d, 0x00, 72, 8 },
119 /* 48 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 48000, 0x08, 0x00, 96, 8 },
120 /* 54 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 54000, 0x0c, 0x00, 108, 8 },
121 /* 6.5 Mb */ { AH_TRUE, HT, 60,60, 60, 6500, 0x80, 0x00, 0, 4 },
122 /* 13 Mb */ { AH_TRUE, HT, 60, 60, 60, 13000, 0x81, 0x00, 1, 6 },
123 /*19.5 Mb */ { AH_TRUE, HT, 60,60, 60, 19500, 0x82, 0x00, 2, 6 },
124 /* 26 Mb */ { AH_TRUE, HT, 60, 60, 60, 26000, 0x83, 0x00, 3, 8 },
125 /* 39 Mb */ { AH_TRUE, HT, 60, 60, 60, 39000, 0x84, 0x00, 4, 8 },
126 /* 52 Mb */ { AH_TRUE, HT, 60, 60, 60, 52000, 0x85, 0x00, 5, 8 },
127 /*58.5 Mb */ { AH_TRUE, HT, 60,60,60, 58500, 0x86, 0x00, 6, 8 },
128 /* 65 Mb */ { AH_TRUE, HT, 60, 60, 60, 65000, 0x87, 0x00, 7, 8 },
129 /* 13 Mb */ { AH_TRUE, HT, 60, 60, 60, 13000, 0x88, 0x00, 8, 4 },
130 /* 26 Mb */ { AH_TRUE, HT, 60, 60, 60, 26000, 0x89, 0x00, 9, 6 },
131 /* 39 Mb */ { AH_TRUE, HT, 60, 60, 60, 39000, 0x8a, 0x00, 10, 6 },
132 /* 52 Mb */ { AH_TRUE, HT, 60, 60, 60, 52000, 0x8b, 0x00, 11, 8 },
133 /* 78 Mb */ { AH_TRUE, HT, 60, 60, 60, 78000, 0x8c, 0x00, 12, 8 },
134 /* 104 Mb */ { AH_TRUE, HT, 60, 60, 60, 104000, 0x8d, 0x00, 13, 8 },
135 /* 117 Mb */ { AH_TRUE, HT, 60, 60, 60, 117000, 0x8e, 0x00, 14, 8 },
136 /* 130 Mb */ { AH_TRUE, HT, 60, 60, 60, 130000, 0x8f, 0x00, 15, 8 },
140 HAL_RATE_TABLE ar5416_11na_table = {
142 24, /* number of rates */
146 /* valid rateCode Preamble dot11Rate Rate */
147 /* 6 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 6000, 0x0b, 0x00, (0x80|12), 0 },
148 /* 9 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 9000, 0x0f, 0x00, 18, 0 },
149 /* 12 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 12000, 0x0a, 0x00, (0x80|24), 2 },
150 /* 18 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 18000, 0x0e, 0x00, 36, 2 },
151 /* 24 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 24000, 0x09, 0x00, (0x80|48), 4 },
152 /* 36 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 36000, 0x0d, 0x00, 72, 4 },
153 /* 48 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 48000, 0x08, 0x00, 96, 4 },
154 /* 54 Mb */ { AH_TRUE, OFDM, 60, 60, 60, 54000, 0x0c, 0x00, 108, 4 },
155 /* 6.5 Mb */ { AH_TRUE, HT, 60, 60, 60, 6500, 0x80, 0x00, 0, 0 },
156 /* 13 Mb */ { AH_TRUE, HT, 60, 60, 60, 13000, 0x81, 0x00, 1, 2 },
157 /*19.5 Mb */ { AH_TRUE, HT, 60, 60, 60, 19500, 0x82, 0x00, 2, 2 },
158 /* 26 Mb */ { AH_TRUE, HT, 60, 60, 60, 26000, 0x83, 0x00, 3, 4 },
159 /* 39 Mb */ { AH_TRUE, HT, 60, 60, 60, 39000, 0x84, 0x00, 4, 4 },
160 /* 52 Mb */ { AH_TRUE, HT, 60, 60, 60, 52000, 0x85, 0x00, 5, 4 },
161 /*58.5 Mb */ { AH_TRUE, HT, 60, 60, 60, 58500, 0x86, 0x00, 6, 4 },
162 /* 65 Mb */ { AH_TRUE, HT, 60, 60, 60, 65000, 0x87, 0x00, 7, 4 },
163 /* 13 Mb */ { AH_TRUE, HT, 60, 60, 60, 13000, 0x88, 0x00, 8, 0 },
164 /* 26 Mb */ { AH_TRUE, HT, 60, 60, 60, 26000, 0x89, 0x00, 9, 2 },
165 /* 39 Mb */ { AH_TRUE, HT, 60, 60, 60, 39000, 0x8a, 0x00, 10, 2 },
166 /* 52 Mb */ { AH_TRUE, HT, 60, 60, 60, 52000, 0x8b, 0x00, 11, 4 },
167 /* 78 Mb */ { AH_TRUE, HT, 60, 60, 60, 78000, 0x8c, 0x00, 12, 4 },
168 /* 104 Mb */ { AH_TRUE, HT, 60, 60, 60, 104000, 0x8d, 0x00, 13, 4 },
169 /* 117 Mb */ { AH_TRUE, HT, 60, 60, 60, 117000, 0x8e, 0x00, 14, 4 },
170 /* 130 Mb */ { AH_TRUE, HT, 60, 60, 60, 130000, 0x8f, 0x00, 15, 4 },
181 const HAL_RATE_TABLE *
182 ar5416GetRateTable(struct ath_hal *ah, a_uint32_t mode)
187 rt = &ar5416_11a_table;
190 rt = &ar5416_11b_table;
193 rt = &ar5416_11g_table;
196 rt = &ar5416_11ng_table;
199 rt = &ar5416_11na_table;
210 #define OFDM IEEE80211_T_OFDM
211 #define CCK IEEE80211_T_CCK
212 #define TURBO IEEE80211_T_TURBO
213 #define XR ATHEROS_T_XR
214 #define HT IEEE80211_T_HT
216 HAL_RATE_TABLE ar5416_11ng_table = {
218 33, /* number of rates */
222 /* valid rateCode Preamble dot11Rate Rate */
223 /*[ 0] 1 Mb */ { AH_TRUE, CCK, 1000, 0x1b, 0x00, (0x80| 2), 0 },
224 /*[ 1] 2 Mb */ { AH_TRUE, CCK, 2000, 0x1a, 0x04, (0x80| 4), 1 },
225 /*[ 2] 5.5 Mb */ { AH_TRUE, CCK, 5500, 0x19, 0x04, (0x80|11), 2 },
226 /*[ 3] 11 Mb */ { AH_TRUE, CCK, 11000, 0x18, 0x04, (0x80|22), 3 },
227 /* Hardware workaround - remove rates 6, 9 from rate ctrl */
228 /*[ 4] 6 Mb */ { AH_FALSE, OFDM, 6000, 0x0b, 0x00, 12, 4 },
229 /*[ 5] 9 Mb */ { AH_FALSE, OFDM, 9000, 0x0f, 0x00, 18, 4 },
230 /*[ 6] 12 Mb */ { AH_TRUE, OFDM, 12000, 0x0a, 0x00, 24, 6 },
231 /*[ 7] 18 Mb */ { AH_TRUE, OFDM, 18000, 0x0e, 0x00, 36, 6 },
232 /*[ 8] 24 Mb */ { AH_TRUE, OFDM, 24000, 0x09, 0x00, 48, 8 },
233 /*[ 9] 36 Mb */ { AH_TRUE, OFDM, 36000, 0x0d, 0x00, 72, 8 },
234 /*[10] 48 Mb */ { AH_TRUE, OFDM, 48000, 0x08, 0x00, 96, 8 },
235 /*[11] 54 Mb */ { AH_TRUE, OFDM, 54000, 0x0c, 0x00, 108, 8 },
236 /*[12] 6.5 Mb */ { AH_TRUE, HT, 6500, 0x80, 0x00, 0, 4 },
237 /*[13] 13 Mb */ { AH_TRUE, HT, 13000, 0x81, 0x00, 1, 6 },
238 /*[14]19.5 Mb */ { AH_TRUE, HT, 19500, 0x82, 0x00, 2, 6 },
239 /*[15] 26 Mb */ { AH_TRUE, HT, 26000, 0x83, 0x00, 3, 8 },
240 /*[16] 39 Mb */ { AH_TRUE, HT, 39000, 0x84, 0x00, 4, 8 },
241 /*[17] 39 Mb */ { AH_TRUE, HT, 39000, 0x84, 0x00, 4, 8 },
242 /*[18] 52 Mb */ { AH_TRUE, HT, 52000, 0x85, 0x00, 5, 8 },
243 /*[19] 52 Mb */ { AH_TRUE, HT, 52000, 0x85, 0x00, 5, 8 },
244 /*[20]58.5 Mb */ { AH_TRUE, HT, 58500, 0x86, 0x00, 6, 8 },
245 /*[21]58.5 Mb */ { AH_TRUE, HT, 58500, 0x86, 0x00, 6, 8 },
246 /*[22] 65 Mb */ { AH_TRUE, HT, 65000, 0x87, 0x00, 7, 8 },
247 /*[23] 65 Mb */ { AH_TRUE, HT, 65000, 0x87, 0x00, 7, 8 },
248 /*[24] 52 Mb */ { AH_TRUE, HT, 52000, 0x8b, 0x00, 11, 8 },
249 /*[25] 78 Mb */ { AH_TRUE, HT, 78000, 0x8c, 0x00, 12, 8 },
250 /*[26] 78 Mb */ { AH_TRUE, HT, 78000, 0x8c, 0x00, 12, 8 },
251 /*[27] 104 Mb */ { AH_TRUE, HT, 104000, 0x8d, 0x00, 13, 8 },
252 /*[28] 104 Mb */ { AH_TRUE, HT, 104000, 0x8d, 0x00, 13, 8 },
253 /*[29] 117 Mb */ { AH_TRUE, HT, 117000, 0x8e, 0x00, 14, 8 },
254 /*[30] 117 Mb */ { AH_TRUE, HT, 117000, 0x8e, 0x00, 14, 8 },
255 /*[31] 130 Mb */ { AH_TRUE, HT, 130000, 0x8f, 0x00, 15, 8 },
256 /*[32] 130 Mb */ { AH_TRUE, HT, 130000, 0x8f, 0x00, 15, 8 },
260 #ifdef ATH_SUPPORT_A_MODE
262 HAL_RATE_TABLE ar5416_11na_table = {
264 28, /* number of rates */
268 /* valid rateCode Preamble dot11Rate Rate */
269 /*[ 0] 6 Mb */ { AH_TRUE, OFDM, 6000, 0x0b, 0x00, (0x80|12), 0 },
270 /*[ 1] 9 Mb */ { AH_TRUE, OFDM, 9000, 0x0f, 0x00, 18, 0 },
271 /*[ 2] 12 Mb */ { AH_TRUE, OFDM, 12000, 0x0a, 0x00, (0x80|24), 2 },
272 /*[ 3] 18 Mb */ { AH_TRUE, OFDM, 18000, 0x0e, 0x00, 36, 2 },
273 /*[ 4] 24 Mb */ { AH_TRUE, OFDM, 24000, 0x09, 0x00, (0x80|48), 4 },
274 /*[ 5] 36 Mb */ { AH_TRUE, OFDM, 36000, 0x0d, 0x00, 72, 4 },
275 /*[ 6] 48 Mb */ { AH_TRUE, OFDM, 48000, 0x08, 0x00, 96, 4 },
276 /*[ 7] 54 Mb */ { AH_TRUE, OFDM, 54000, 0x0c, 0x00, 108, 4 },
277 /*[ 8] 6.5 Mb */ { AH_TRUE, HT, 6500, 0x80, 0x00, 0, 0 },
278 /*[ 9] 13 Mb */ { AH_TRUE, HT, 13000, 0x81, 0x00, 1, 2 },
279 /*[10]19.5 Mb */ { AH_TRUE, HT, 19500, 0x82, 0x00, 2, 2 },
280 /*[11] 26 Mb */ { AH_TRUE, HT, 26000, 0x83, 0x00, 3, 4 },
281 /*[12] 39 Mb */ { AH_TRUE, HT, 39000, 0x84, 0x00, 4, 4 },
282 /*[13] 39 Mb */ { AH_TRUE, HT, 39000, 0x84, 0x00, 4, 4 },
283 /*[14] 52 Mb */ { AH_TRUE, HT, 52000, 0x85, 0x00, 5, 4 },
284 /*[15] 52 Mb */ { AH_TRUE, HT, 52000, 0x85, 0x00, 5, 4 },
285 /*[16]58.5 Mb */ { AH_TRUE, HT, 58500, 0x86, 0x00, 6, 4 },
286 /*[17]58.5 Mb */ { AH_TRUE, HT, 58500, 0x86, 0x00, 6, 4 },
287 /*[18] 65 Mb */ { AH_TRUE, HT, 65000, 0x87, 0x00, 7, 4 },
288 /*[19] 65 Mb */ { AH_TRUE, HT, 65000, 0x87, 0x00, 7, 4 },
289 /*[20] 52 Mb */ { AH_TRUE, HT, 52000, 0x8b, 0x00, 11, 4 },
290 /*[21] 78 Mb */ { AH_TRUE, HT, 78000, 0x8c, 0x00, 12, 4 },
291 /*[22] 78 Mb */ { AH_TRUE, HT, 78000, 0x8c, 0x00, 12, 4 },
292 /*[23] 104 Mb */ { AH_TRUE, HT, 104000, 0x8d, 0x00, 13, 4 },
293 /*[24] 104 Mb */ { AH_TRUE, HT, 104000, 0x8d, 0x00, 13, 4 },
294 /*[25] 117 Mb */ { AH_TRUE, HT, 117000, 0x8e, 0x00, 14, 4 },
295 /*[26] 117 Mb */ { AH_TRUE, HT, 117000, 0x8e, 0x00, 14, 4 },
296 /*[27] 130 Mb */ { AH_TRUE, HT, 130000, 0x8f, 0x00, 15, 4 },
308 const HAL_RATE_TABLE *
309 ar5416GetRateTable(struct ath_hal *ah, a_uint32_t mode)
314 rt = &ar5416_11ng_table;
316 #ifdef ATH_SUPPORT_A_MODE
318 rt = &ar5416_11na_table;