Initial cut of the open ath9k htc firmware.
[open-ath9k-htc-firmware.git] / target_firmware / wlan / ar5416_phy.c
1 #include "opt_ah.h"
2 #include "ah.h"
3 #include "ah_internal.h"
4 #include "ar5416.h"
5
6 #ifdef MAGPIE_MERLIN
7
8 #define OFDM    IEEE80211_T_OFDM
9 #define CCK     IEEE80211_T_CCK
10 #define TURBO   IEEE80211_T_TURBO
11 #define XR      ATHEROS_T_XR
12 #define HT      IEEE80211_T_HT
13
14 HAL_RATE_TABLE ar5416_11a_table = {
15         8,  /* number of rates */
16         { 0 },
17         {
18                 /*                                                  short            ctrl  */
19                 /*                valid                 rateCode Preamble  dot11Rate Rate */
20                 /*   6 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,   6000,     0x0b,    0x00, (0x80|12),   0 },
21                 /*   9 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,   9000,     0x0f,    0x00,        18,   0 },
22                 /*  12 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  12000,     0x0a,    0x00, (0x80|24),   2 },
23                 /*  18 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  18000,     0x0e,    0x00,        36,   2 },
24                 /*  24 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  24000,     0x09,    0x00, (0x80|48),   4 },
25                 /*  36 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  36000,     0x0d,    0x00,        72,   4 },
26                 /*  48 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  48000,     0x08,    0x00,        96,   4 },
27                 /*  54 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  54000,     0x0c,    0x00,       108,   4 }
28         },
29 };
30
31 HAL_RATE_TABLE ar5416_11b_table = {
32         4,  /* number of rates */
33         { 0 },
34         {
35                 /*                                                 short            ctrl  */
36                 /*                valid                rateCode Preamble  dot11Rate Rate */
37                 /*   1 Mb */ {  AH_TRUE,  CCK, 60, 60, 60,  1000,    0x1b,    0x00, (0x80| 2),   0 },
38                 /*   2 Mb */ {  AH_TRUE,  CCK, 60, 60, 60,  2000,    0x1a,    0x04, (0x80| 4),   1 },
39                 /* 5.5 Mb */ {  AH_TRUE,  CCK, 60, 60, 60,  5500,    0x19,    0x04, (0x80|11),   1 },
40                 /*  11 Mb */ {  AH_TRUE,  CCK, 60, 60, 60, 11000,    0x18,    0x04, (0x80|22),   1 }
41         },
42 };
43
44 HAL_RATE_TABLE ar5416_11g_table = {
45         12,  /* number of rates */
46         { 0 },
47         {
48         /*                                                 short            ctrl  */
49         /*                valid                rateCode Preamble  dot11Rate Rate */
50                 /*   1 Mb */ {  AH_TRUE, CCK,  60,  60,  60, 1000,    0x1b,    0x00, (0x80| 2),   0 },
51                 /*   2 Mb */ {  AH_TRUE, CCK,  60,  60,  60, 2000,    0x1a,    0x04, (0x80| 4),   1 },
52                 /* 5.5 Mb */ {  AH_TRUE, CCK,  60,  60,  60, 5500,    0x19,    0x04, (0x80|11),   2 },
53                 /*  11 Mb */ {  AH_TRUE, CCK,  60,  60,  60, 11000,   0x18,    0x04, (0x80|22),   3 },
54                 /* Hardware workaround - remove rates 6, 9 from rate ctrl */
55                 /*   6 Mb */ { AH_FALSE, OFDM, 60,  60, 60,  6000,    0x0b,    0x00,        12,   4 },
56                 /*   9 Mb */ { AH_FALSE, OFDM, 60,  60, 60,  9000,    0x0f,    0x00,        18,   4 },
57                 /*  12 Mb */ {  AH_TRUE, OFDM, 60,  60, 60, 12000,    0x0a,    0x00,        24,   6 },
58                 /*  18 Mb */ {  AH_TRUE, OFDM, 60,  60, 60, 18000,    0x0e,    0x00,        36,   6 },
59                 /*  24 Mb */ {  AH_TRUE, OFDM, 60,  60, 60, 24000,    0x09,    0x00,        48,   8 },
60                 /*  36 Mb */ {  AH_TRUE, OFDM, 60,  60, 60, 36000,    0x0d,    0x00,        72,   8 },
61                 /*  48 Mb */ {  AH_TRUE, OFDM, 60,  60, 60, 48000,    0x08,    0x00,        96,   8 },
62                 /*  54 Mb */ {  AH_TRUE, OFDM, 60,  60, 60, 54000,    0x0c,    0x00,       108,   8 }
63         },
64 };
65
66 HAL_RATE_TABLE ar5416_11ng_table = {
67
68         28,  /* number of rates */
69         { -1 },
70         {
71                 /*                                                 short            ctrl  */
72                 /*                valid                rateCode Preamble  dot11Rate Rate */
73                 /*   1 Mb */ {  AH_TRUE, CCK,  60, 60, 60,  1000,    0x1b,    0x00, (0x80| 2),   0 },
74                 /*   2 Mb */ {  AH_TRUE, CCK,  60, 60, 60,   2000,    0x1a,    0x04, (0x80| 4),   1 },
75                 /* 5.5 Mb */ {  AH_TRUE, CCK,  60, 60, 60,   5500,    0x19,    0x04, (0x80|11),   2 },
76                 /*  11 Mb */ {  AH_TRUE, CCK,  60, 60, 60,  11000,    0x18,    0x04, (0x80|22),   3 },
77                 /* Hardware workaround - remove rates 6, 9 from rate ctrl */
78                 /*   6 Mb */ { AH_FALSE, OFDM, 60, 60, 60,  6000,    0x0b,    0x00,        12,   4 },
79                 /*   9 Mb */ { AH_FALSE, OFDM, 60, 60, 60,  9000,    0x0f,    0x00,        18,   4 },
80                 /*  12 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  12000,    0x0a,    0x00,        24,   6 },
81                 /*  18 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 18000,    0x0e,    0x00,        36,   6 },
82                 /*  24 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  24000,    0x09,    0x00,        48,   8 },
83                 /*  36 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  36000,    0x0d,    0x00,        72,   8 },
84                 /*  48 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  48000,    0x08,    0x00,        96,   8 },
85                 /*  54 Mb */ {  AH_TRUE, OFDM, 60, 60, 60,  54000,    0x0c,    0x00,       108,   8 },
86                 /* 6.5 Mb */ {  AH_TRUE, HT,   60,60, 60,   6500,    0x80,    0x00,         0,   4 },
87                 /*  13 Mb */ {  AH_TRUE, HT,   60, 60, 60,  13000,   0x81,    0x00,         1,   6 },
88                 /*19.5 Mb */ {  AH_TRUE, HT,   60,60, 60,   19500,  0x82,    0x00,         2,   6 },
89                 /*  26 Mb */ {  AH_TRUE, HT,   60, 60, 60,  26000,  0x83,    0x00,         3,   8 },
90                 /*  39 Mb */ {  AH_TRUE, HT,   60, 60, 60,  39000,  0x84,    0x00,         4,   8 },
91                 /*  52 Mb */ {  AH_TRUE, HT,   60, 60, 60,  52000,  0x85,    0x00,         5,   8 },
92                 /*58.5 Mb */ {  AH_TRUE, HT,   60,60,60,  58500,  0x86,    0x00,         6,   8 },
93                 /*  65 Mb */ {  AH_TRUE, HT,   60, 60, 60,  65000,  0x87,    0x00,         7,   8 },
94                 /*  13 Mb */ {  AH_TRUE, HT,   60, 60, 60,  13000,  0x88,    0x00,         8,   4 },
95                 /*  26 Mb */ {  AH_TRUE, HT,   60, 60, 60,   26000,  0x89,    0x00,         9,   6 },
96                 /*  39 Mb */ {  AH_TRUE, HT,   60, 60, 60,   39000,  0x8a,    0x00,        10,   6 },
97                 /*  52 Mb */ {  AH_TRUE, HT,   60, 60, 60,   52000,  0x8b,    0x00,        11,   8 },
98                 /*  78 Mb */ {  AH_TRUE, HT,   60, 60, 60,   78000,  0x8c,    0x00,        12,   8 },
99                 /* 104 Mb */ {  AH_TRUE, HT,   60, 60, 60,  104000,  0x8d,    0x00,        13,   8 },
100                 /* 117 Mb */ {  AH_TRUE, HT,   60, 60, 60,  117000,  0x8e,    0x00,        14,   8 },
101                 /* 130 Mb */ {  AH_TRUE, HT,   60, 60, 60,  130000,  0x8f,    0x00,        15,   8 },
102         },
103 };
104
105 HAL_RATE_TABLE ar5416_11na_table = {
106
107         24,  /* number of rates */
108         { -1 },
109         {
110                 /*                                                 short            ctrl  */
111                 /*                valid                rateCode Preamble  dot11Rate Rate */
112                 /*   6 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 6000,    0x0b,    0x00, (0x80|12),   0 },
113                 /*   9 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 9000,    0x0f,    0x00,        18,   0 },
114                 /*  12 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 12000,    0x0a,    0x00, (0x80|24),   2 },
115                 /*  18 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 18000,    0x0e,    0x00,        36,   2 },
116                 /*  24 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 24000,    0x09,    0x00, (0x80|48),   4 },
117                 /*  36 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 36000,    0x0d,    0x00,        72,   4 },
118                 /*  48 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 48000,    0x08,    0x00,        96,   4 },
119                 /*  54 Mb */ {  AH_TRUE, OFDM, 60, 60, 60, 54000,    0x0c,    0x00,       108,   4 },
120                 /* 6.5 Mb */ {  AH_TRUE, HT,   60, 60, 60, 6500,    0x80,    0x00,         0,    0 },
121                 /*  13 Mb */ {  AH_TRUE, HT,   60, 60, 60, 13000,    0x81,    0x00,         1,   2 },
122                 /*19.5 Mb */ {  AH_TRUE, HT,   60, 60, 60, 19500,    0x82,    0x00,         2,   2 },
123                 /*  26 Mb */ {  AH_TRUE, HT,   60, 60, 60, 26000,    0x83,    0x00,         3,   4 },
124                 /*  39 Mb */ {  AH_TRUE, HT,   60, 60, 60, 39000,    0x84,    0x00,         4,   4 },
125                 /*  52 Mb */ {  AH_TRUE, HT,   60, 60, 60, 52000,    0x85,    0x00,         5,   4 },
126                 /*58.5 Mb */ {  AH_TRUE, HT,   60, 60, 60, 58500,    0x86,    0x00,         6,   4 },
127                 /*  65 Mb */ {  AH_TRUE, HT,   60, 60, 60, 65000,    0x87,    0x00,         7,   4 },
128                 /*  13 Mb */ {  AH_TRUE, HT,   60, 60, 60, 13000,    0x88,    0x00,         8,   0 },
129                 /*  26 Mb */ {  AH_TRUE, HT,   60, 60, 60, 26000,    0x89,    0x00,         9,   2 },
130                 /*  39 Mb */ {  AH_TRUE, HT,   60, 60, 60, 39000,    0x8a,    0x00,        10,   2 },
131                 /*  52 Mb */ {  AH_TRUE, HT,   60, 60, 60, 52000,    0x8b,    0x00,        11,   4 },
132                 /*  78 Mb */ {  AH_TRUE, HT,   60, 60, 60, 78000,    0x8c,    0x00,        12,   4 },
133                 /* 104 Mb */ {  AH_TRUE, HT,   60, 60, 60, 104000,    0x8d,    0x00,       13,   4 },
134                 /* 117 Mb */ {  AH_TRUE, HT,   60, 60, 60, 117000,    0x8e,    0x00,       14,   4 },
135                 /* 130 Mb */ {  AH_TRUE, HT,   60, 60, 60, 130000,    0x8f,    0x00,       15,   4 },
136         },
137 };
138
139 adf_os_export_symbol(ar5416_11na_table);
140
141 #undef  OFDM
142 #undef  CCK
143 #undef  TURBO
144 #undef  XR
145 #undef  HT
146 #undef  HT_HGI
147
148 const HAL_RATE_TABLE *
149 ar5416GetRateTable(struct ath_hal *ah, a_uint32_t mode)
150 {
151         HAL_RATE_TABLE *rt;
152         switch (mode) {
153         case HAL_MODE_11A:
154                 rt = &ar5416_11a_table;
155                 break;
156         case HAL_MODE_11B:
157                 rt = &ar5416_11b_table;
158                 break;
159         case HAL_MODE_11G:
160                 rt =  &ar5416_11g_table;
161                 break;
162         case HAL_MODE_11NG:
163                 rt = &ar5416_11ng_table;
164                 break;
165         case HAL_MODE_11NA:
166                 rt = &ar5416_11na_table;
167                 break;
168         default:
169                 return AH_NULL;
170         }
171
172         return rt;
173 }
174
175 #else
176
177 #define OFDM    IEEE80211_T_OFDM
178 #define CCK     IEEE80211_T_CCK
179 #define TURBO   IEEE80211_T_TURBO
180 #define XR      ATHEROS_T_XR
181 #define HT      IEEE80211_T_HT
182
183 HAL_RATE_TABLE ar5416_11ng_table = {
184
185         33,  /* number of rates */
186         { -1 },
187         {
188                 /*                                                 short            ctrl  */
189                 /*                valid                rateCode Preamble  dot11Rate Rate */
190                 /*[ 0]   1 Mb */ {  AH_TRUE, CCK,     1000,    0x1b,    0x00, (0x80| 2),   0 },
191                 /*[ 1]   2 Mb */ {  AH_TRUE, CCK,     2000,    0x1a,    0x04, (0x80| 4),   1 },
192                 /*[ 2] 5.5 Mb */ {  AH_TRUE, CCK,     5500,    0x19,    0x04, (0x80|11),   2 },
193                 /*[ 3]  11 Mb */ {  AH_TRUE, CCK,    11000,    0x18,    0x04, (0x80|22),   3 },
194                 /* Hardware workaround - remove rates 6, 9 from rate ctrl */
195                 /*[ 4]   6 Mb */ { AH_FALSE, OFDM,    6000,    0x0b,    0x00,        12,   4 },
196                 /*[ 5]   9 Mb */ { AH_FALSE, OFDM,    9000,    0x0f,    0x00,        18,   4 },
197                 /*[ 6]  12 Mb */ {  AH_TRUE, OFDM,   12000,    0x0a,    0x00,        24,   6 },
198                 /*[ 7]  18 Mb */ {  AH_TRUE, OFDM,   18000,    0x0e,    0x00,        36,   6 },
199                 /*[ 8]  24 Mb */ {  AH_TRUE, OFDM,   24000,    0x09,    0x00,        48,   8 },
200                 /*[ 9]  36 Mb */ {  AH_TRUE, OFDM,   36000,    0x0d,    0x00,        72,   8 },
201                 /*[10]  48 Mb */ {  AH_TRUE, OFDM,   48000,    0x08,    0x00,        96,   8 },
202                 /*[11]  54 Mb */ {  AH_TRUE, OFDM,   54000,    0x0c,    0x00,       108,   8 },
203                 /*[12] 6.5 Mb */ {  AH_TRUE, HT,      6500,    0x80,    0x00,             0,   4 },
204                 /*[13]  13 Mb */ {  AH_TRUE, HT,         13000,    0x81,    0x00,         1,   6 },
205                 /*[14]19.5 Mb */ {  AH_TRUE, HT,         19500,    0x82,    0x00,         2,   6 },
206                 /*[15]  26 Mb */ {  AH_TRUE, HT,         26000,    0x83,    0x00,         3,   8 },
207                 /*[16]  39 Mb */ {  AH_TRUE, HT,         39000,    0x84,    0x00,         4,   8 },
208                 /*[17]  39 Mb */ {  AH_TRUE, HT,         39000,    0x84,    0x00,         4,   8 },
209                 /*[18]  52 Mb */ {  AH_TRUE, HT,         52000,    0x85,    0x00,         5,   8 },
210                 /*[19]  52 Mb */ {  AH_TRUE, HT,         52000,    0x85,    0x00,         5,   8 },
211                 /*[20]58.5 Mb */ {  AH_TRUE, HT,         58500,    0x86,    0x00,         6,   8 },
212                 /*[21]58.5 Mb */ {  AH_TRUE, HT,         58500,    0x86,    0x00,         6,   8 },
213                 /*[22]  65 Mb */ {  AH_TRUE, HT,         65000,    0x87,    0x00,         7,   8 },
214                 /*[23]  65 Mb */ {  AH_TRUE, HT,         65000,    0x87,    0x00,         7,   8 },
215                 /*[24]  52 Mb */ {  AH_TRUE, HT,         52000,    0x8b,    0x00,        11,   8 },
216                 /*[25]  78 Mb */ {  AH_TRUE, HT,         78000,    0x8c,    0x00,        12,   8 },
217                 /*[26]  78 Mb */ {  AH_TRUE, HT,         78000,    0x8c,    0x00,        12,   8 },
218                 /*[27] 104 Mb */ {  AH_TRUE, HT,        104000,    0x8d,    0x00,        13,   8 },
219                 /*[28] 104 Mb */ {  AH_TRUE, HT,        104000,    0x8d,    0x00,        13,   8 },
220                 /*[29] 117 Mb */ {  AH_TRUE, HT,        117000,    0x8e,    0x00,        14,   8 },
221                 /*[30] 117 Mb */ {  AH_TRUE, HT,        117000,    0x8e,    0x00,        14,   8 },
222                 /*[31] 130 Mb */ {  AH_TRUE, HT,        130000,    0x8f,    0x00,        15,   8 },
223                 /*[32] 130 Mb */ {  AH_TRUE, HT,        130000,    0x8f,    0x00,        15,   8 },
224         },
225 };
226
227 #ifdef ATH_SUPPORT_A_MODE
228
229 HAL_RATE_TABLE ar5416_11na_table = {
230
231         28,  /* number of rates */
232         { -1 },
233         {
234                 /*                                                 short            ctrl  */
235                 /*                valid                rateCode Preamble  dot11Rate Rate */
236                 /*[ 0]   6 Mb */ {  AH_TRUE, OFDM,    6000,    0x0b,    0x00, (0x80|12),   0 },
237                 /*[ 1]   9 Mb */ {  AH_TRUE, OFDM,    9000,    0x0f,    0x00,        18,   0 },
238                 /*[ 2]  12 Mb */ {  AH_TRUE, OFDM,   12000,    0x0a,    0x00, (0x80|24),   2 },
239                 /*[ 3]  18 Mb */ {  AH_TRUE, OFDM,   18000,    0x0e,    0x00,        36,   2 },
240                 /*[ 4]  24 Mb */ {  AH_TRUE, OFDM,   24000,    0x09,    0x00, (0x80|48),   4 },
241                 /*[ 5]  36 Mb */ {  AH_TRUE, OFDM,   36000,    0x0d,    0x00,        72,   4 },
242                 /*[ 6]  48 Mb */ {  AH_TRUE, OFDM,   48000,    0x08,    0x00,        96,   4 },
243                 /*[ 7]  54 Mb */ {  AH_TRUE, OFDM,   54000,    0x0c,    0x00,       108,   4 },
244                 /*[ 8] 6.5 Mb */ {  AH_TRUE, HT,      6500,    0x80,    0x00,         0,   0 },
245                 /*[ 9]  13 Mb */ {  AH_TRUE, HT,         13000,    0x81,    0x00,         1,   2 },
246                 /*[10]19.5 Mb */ {  AH_TRUE, HT,         19500,    0x82,    0x00,         2,   2 },
247                 /*[11]  26 Mb */ {  AH_TRUE, HT,         26000,    0x83,    0x00,         3,   4 },
248                 /*[12]  39 Mb */ {  AH_TRUE, HT,         39000,    0x84,    0x00,         4,   4 },
249                 /*[13]  39 Mb */ {  AH_TRUE, HT,         39000,    0x84,    0x00,         4,   4 },
250                 /*[14]  52 Mb */ {  AH_TRUE, HT,         52000,    0x85,    0x00,         5,   4 },
251                 /*[15]  52 Mb */ {  AH_TRUE, HT,         52000,    0x85,    0x00,         5,   4 },
252                 /*[16]58.5 Mb */ {  AH_TRUE, HT,         58500,    0x86,    0x00,         6,   4 },
253                 /*[17]58.5 Mb */ {  AH_TRUE, HT,         58500,    0x86,    0x00,         6,   4 },
254                 /*[18]  65 Mb */ {  AH_TRUE, HT,         65000,    0x87,    0x00,         7,   4 },
255                 /*[19]  65 Mb */ {  AH_TRUE, HT,         65000,    0x87,    0x00,         7,   4 },
256                 /*[20]  52 Mb */ {  AH_TRUE, HT,         52000,    0x8b,    0x00,        11,   4 },
257                 /*[21]  78 Mb */ {  AH_TRUE, HT,         78000,    0x8c,    0x00,        12,   4 },
258                 /*[22]  78 Mb */ {  AH_TRUE, HT,         78000,    0x8c,    0x00,        12,   4 },
259                 /*[23] 104 Mb */ {  AH_TRUE, HT,        104000,    0x8d,    0x00,        13,   4 },
260                 /*[24] 104 Mb */ {  AH_TRUE, HT,        104000,    0x8d,    0x00,        13,   4 },
261                 /*[25] 117 Mb */ {  AH_TRUE, HT,        117000,    0x8e,    0x00,        14,   4 },
262                 /*[26] 117 Mb */ {  AH_TRUE, HT,        117000,    0x8e,    0x00,        14,   4 },
263                 /*[27] 130 Mb */ {  AH_TRUE, HT,        130000,    0x8f,    0x00,        15,   4 },
264         },
265 };
266 #endif
267
268 #undef  OFDM
269 #undef  CCK
270 #undef  TURBO
271 #undef  XR
272 #undef  HT
273 #undef  HT_HGI
274
275 const HAL_RATE_TABLE *
276 ar5416GetRateTable(struct ath_hal *ah, a_uint32_t mode)
277 {
278         HAL_RATE_TABLE *rt;
279         switch (mode) {
280         case HAL_MODE_11NG:
281                 rt = &ar5416_11ng_table;
282                 break;
283 #ifdef ATH_SUPPORT_A_MODE
284         case HAL_MODE_11NA:
285                 rt = &ar5416_11na_table;
286                 break;
287 #endif
288         default:
289                 return AH_NULL;
290         }
291
292         return rt;
293 }
294
295 #endif