This source file includes following definitions.
- vnt_rf_write_embedded
- vnt_rf_setpower
- vnt_rf_addpower
- vnt_rf_set_txpower
- vnt_rf_rssi_to_dbm
- vnt_rf_table_download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include "mac.h"
25 #include "rf.h"
26 #include "baseband.h"
27 #include "usbpipe.h"
28
29 #define CB_AL2230_INIT_SEQ 15
30 #define AL2230_PWR_IDX_LEN 64
31
32 #define CB_AL7230_INIT_SEQ 16
33 #define AL7230_PWR_IDX_LEN 64
34
35 #define CB_VT3226_INIT_SEQ 11
36 #define VT3226_PWR_IDX_LEN 64
37
38 #define CB_VT3342_INIT_SEQ 13
39 #define VT3342_PWR_IDX_LEN 64
40
41 static u8 al2230_init_table[CB_AL2230_INIT_SEQ][3] = {
42 {0x03, 0xf7, 0x90},
43 {0x03, 0x33, 0x31},
44 {0x01, 0xb8, 0x02},
45 {0x00, 0xff, 0xf3},
46 {0x00, 0x05, 0xa4},
47 {0x0f, 0x4d, 0xc5},
48 {0x08, 0x05, 0xb6},
49 {0x01, 0x47, 0xc7},
50 {0x00, 0x06, 0x88},
51 {0x04, 0x03, 0xb9},
52 {0x00, 0xdb, 0xba},
53 {0x00, 0x09, 0x9b},
54 {0x0b, 0xdf, 0xfc},
55 {0x00, 0x00, 0x0d},
56 {0x00, 0x58, 0x0f}
57 };
58
59 static u8 al2230_channel_table0[CB_MAX_CHANNEL_24G][3] = {
60 {0x03, 0xf7, 0x90},
61 {0x03, 0xf7, 0x90},
62 {0x03, 0xe7, 0x90},
63 {0x03, 0xe7, 0x90},
64 {0x03, 0xf7, 0xa0},
65 {0x03, 0xf7, 0xa0},
66 {0x03, 0xe7, 0xa0},
67 {0x03, 0xe7, 0xa0},
68 {0x03, 0xf7, 0xb0},
69 {0x03, 0xf7, 0xb0},
70 {0x03, 0xe7, 0xb0},
71 {0x03, 0xe7, 0xb0},
72 {0x03, 0xf7, 0xc0},
73 {0x03, 0xe7, 0xc0}
74 };
75
76 static u8 al2230_channel_table1[CB_MAX_CHANNEL_24G][3] = {
77 {0x03, 0x33, 0x31},
78 {0x0b, 0x33, 0x31},
79 {0x03, 0x33, 0x31},
80 {0x0b, 0x33, 0x31},
81 {0x03, 0x33, 0x31},
82 {0x0b, 0x33, 0x31},
83 {0x03, 0x33, 0x31},
84 {0x0b, 0x33, 0x31},
85 {0x03, 0x33, 0x31},
86 {0x0b, 0x33, 0x31},
87 {0x03, 0x33, 0x31},
88 {0x0b, 0x33, 0x31},
89 {0x03, 0x33, 0x31},
90 {0x06, 0x66, 0x61}
91 };
92
93 static u8 al7230_init_table[CB_AL7230_INIT_SEQ][3] = {
94 {0x20, 0x37, 0x90},
95 {0x13, 0x33, 0x31},
96 {0x84, 0x1f, 0xf2},
97 {0x3f, 0xdf, 0xa3},
98 {0x7f, 0xd7, 0x84},
99 {0x80, 0x2b, 0x55},
100 {0x56, 0xaf, 0x36},
101 {0xce, 0x02, 0x07},
102 {0x6e, 0xbc, 0x98},
103 {0x22, 0x1b, 0xb9},
104 {0xe0, 0x00, 0x0a},
105 {0x08, 0x03, 0x1b},
106 {0x00, 0x0a, 0x3c},
107 {0xff, 0xff, 0xfd},
108 {0x00, 0x00, 0x0e},
109 {0x1a, 0xba, 0x8f}
110 };
111
112 static u8 al7230_init_table_amode[CB_AL7230_INIT_SEQ][3] = {
113 {0x2f, 0xf5, 0x20},
114 {0x00, 0x00, 0x01},
115 {0x45, 0x1f, 0xe2},
116 {0x5f, 0xdf, 0xa3},
117 {0x6f, 0xd7, 0x84},
118 {0x85, 0x3f, 0x55},
119 {0x56, 0xaf, 0x36},
120 {0xce, 0x02, 0x07},
121 {0x6e, 0xbc, 0x98},
122 {0x22, 0x1b, 0xb9},
123 {0xe0, 0x60, 0x0a},
124 {0x08, 0x03, 0x1b},
125 {0x00, 0x14, 0x7c},
126 {0xff, 0xff, 0xfd},
127 {0x00, 0x00, 0x0e},
128 {0x12, 0xba, 0xcf}
129 };
130
131 static u8 al7230_channel_table0[CB_MAX_CHANNEL][3] = {
132 {0x20, 0x37, 0x90},
133 {0x20, 0x37, 0x90},
134 {0x20, 0x37, 0x90},
135 {0x20, 0x37, 0x90},
136 {0x20, 0x37, 0xa0},
137 {0x20, 0x37, 0xa0},
138 {0x20, 0x37, 0xa0},
139 {0x20, 0x37, 0xa0},
140 {0x20, 0x37, 0xb0},
141 {0x20, 0x37, 0xb0},
142 {0x20, 0x37, 0xb0},
143 {0x20, 0x37, 0xb0},
144 {0x20, 0x37, 0xc0},
145 {0x20, 0x37, 0xc0},
146 {0x0f, 0xf5, 0x20},
147 {0x2f, 0xf5, 0x20},
148 {0x0f, 0xf5, 0x20},
149 {0x0f, 0xf5, 0x20},
150 {0x2f, 0xf5, 0x20},
151 {0x0f, 0xf5, 0x20},
152 {0x2f, 0xf5, 0x30},
153 {0x2f, 0xf5, 0x30},
154 {0x0f, 0xf5, 0x40},
155 {0x2f, 0xf5, 0x40},
156 {0x0f, 0xf5, 0x40},
157 {0x0f, 0xf5, 0x40},
158 {0x2f, 0xf5, 0x40},
159 {0x2f, 0xf5, 0x50},
160 {0x2f, 0xf5, 0x60},
161 {0x2f, 0xf5, 0x60},
162 {0x2f, 0xf5, 0x70},
163 {0x2f, 0xf5, 0x70},
164 {0x2f, 0xf5, 0x70},
165 {0x2f, 0xf5, 0x70},
166 {0x2f, 0xf5, 0x70},
167 {0x2f, 0xf5, 0x70},
168 {0x2f, 0xf5, 0x80},
169 {0x2f, 0xf5, 0x80},
170 {0x2f, 0xf5, 0x80},
171 {0x2f, 0xf5, 0x90},
172 {0x2f, 0xf5, 0xc0},
173 {0x2f, 0xf5, 0xc0},
174 {0x2f, 0xf5, 0xc0},
175 {0x2f, 0xf5, 0xd0},
176 {0x2f, 0xf5, 0xd0},
177 {0x2f, 0xf5, 0xd0},
178 {0x2f, 0xf5, 0xe0},
179 {0x2f, 0xf5, 0xe0},
180 {0x2f, 0xf5, 0xe0},
181 {0x2f, 0xf5, 0xf0},
182 {0x2f, 0xf5, 0xf0},
183 {0x2f, 0xf6, 0x00},
184 {0x2f, 0xf6, 0x00},
185 {0x2f, 0xf6, 0x00},
186 {0x2f, 0xf6, 0x10},
187 {0x2f, 0xf6, 0x10}
188 };
189
190 static u8 al7230_channel_table1[CB_MAX_CHANNEL][3] = {
191 {0x13, 0x33, 0x31},
192 {0x1b, 0x33, 0x31},
193 {0x03, 0x33, 0x31},
194 {0x0b, 0x33, 0x31},
195 {0x13, 0x33, 0x31},
196 {0x1b, 0x33, 0x31},
197 {0x03, 0x33, 0x31},
198 {0x0b, 0x33, 0x31},
199 {0x13, 0x33, 0x31},
200 {0x1b, 0x33, 0x31},
201 {0x03, 0x33, 0x31},
202 {0x0b, 0x33, 0x31},
203 {0x13, 0x33, 0x31},
204 {0x06, 0x66, 0x61},
205 {0x1d, 0x55, 0x51},
206 {0x00, 0x00, 0x01},
207 {0x02, 0xaa, 0xa1},
208 {0x08, 0x00, 0x01},
209 {0x0a, 0xaa, 0xa1},
210 {0x0d, 0x55, 0x51},
211 {0x15, 0x55, 0x51},
212 {0x00, 0x00, 0x01},
213 {0x1d, 0x55, 0x51},
214 {0x00, 0x00, 0x01},
215 {0x02, 0xaa, 0xa1},
216 {0x08, 0x00, 0x01},
217 {0x0a, 0xaa, 0xa1},
218 {0x15, 0x55, 0x51},
219 {0x05, 0x55, 0x51},
220 {0x0a, 0xaa, 0xa1},
221 {0x10, 0x00, 0x01},
222 {0x15, 0x55, 0x51},
223 {0x1a, 0xaa, 0xa1},
224 {0x00, 0x00, 0x01},
225 {0x05, 0x55, 0x51},
226 {0x0a, 0xaa, 0xa1},
227 {0x15, 0x55, 0x51},
228 {0x00, 0x00, 0x01},
229 {0x0a, 0xaa, 0xa1},
230 {0x15, 0x55, 0x51},
231 {0x15, 0x55, 0x51},
232 {0x00, 0x00, 0x01},
233 {0x0a, 0xaa, 0xa1},
234 {0x15, 0x55, 0x51},
235 {0x00, 0x00, 0x01},
236 {0x0a, 0xaa, 0xa1},
237 {0x15, 0x55, 0x51},
238 {0x00, 0x00, 0x01},
239 {0x0a, 0xaa, 0xa1},
240 {0x15, 0x55, 0x51},
241 {0x00, 0x00, 0x01},
242 {0x18, 0x00, 0x01},
243 {0x02, 0xaa, 0xa1},
244 {0x0d, 0x55, 0x51},
245 {0x18, 0x00, 0x01},
246 {0x02, 0xaa, 0xb1}
247 };
248
249 static u8 al7230_channel_table2[CB_MAX_CHANNEL][3] = {
250 {0x7f, 0xd7, 0x84},
251 {0x7f, 0xd7, 0x84},
252 {0x7f, 0xd7, 0x84},
253 {0x7f, 0xd7, 0x84},
254 {0x7f, 0xd7, 0x84},
255 {0x7f, 0xd7, 0x84},
256 {0x7f, 0xd7, 0x84},
257 {0x7f, 0xd7, 0x84},
258 {0x7f, 0xd7, 0x84},
259 {0x7f, 0xd7, 0x84},
260 {0x7f, 0xd7, 0x84},
261 {0x7f, 0xd7, 0x84},
262 {0x7f, 0xd7, 0x84},
263 {0x7f, 0xd7, 0x84},
264 {0x7f, 0xd7, 0x84},
265 {0x6f, 0xd7, 0x84},
266 {0x7f, 0xd7, 0x84},
267 {0x7f, 0xd7, 0x84},
268 {0x7f, 0xd7, 0x84},
269 {0x7f, 0xd7, 0x84},
270 {0x7f, 0xd7, 0x84},
271 {0x6f, 0xd7, 0x84},
272 {0x7f, 0xd7, 0x84},
273 {0x6f, 0xd7, 0x84},
274 {0x7f, 0xd7, 0x84},
275 {0x7f, 0xd7, 0x84},
276 {0x7f, 0xd7, 0x84},
277 {0x7f, 0xd7, 0x84},
278 {0x7f, 0xd7, 0x84},
279 {0x7f, 0xd7, 0x84},
280 {0x7f, 0xd7, 0x84},
281 {0x7f, 0xd7, 0x84},
282 {0x7f, 0xd7, 0x84},
283 {0x6f, 0xd7, 0x84},
284 {0x7f, 0xd7, 0x84},
285 {0x7f, 0xd7, 0x84},
286 {0x7f, 0xd7, 0x84},
287 {0x6f, 0xd7, 0x84},
288 {0x7f, 0xd7, 0x84},
289 {0x7f, 0xd7, 0x84},
290 {0x7f, 0xd7, 0x84},
291 {0x6f, 0xd7, 0x84},
292 {0x7f, 0xd7, 0x84},
293 {0x7f, 0xd7, 0x84},
294 {0x6f, 0xd7, 0x84},
295 {0x7f, 0xd7, 0x84},
296 {0x7f, 0xd7, 0x84},
297 {0x6f, 0xd7, 0x84},
298 {0x7f, 0xd7, 0x84},
299 {0x7f, 0xd7, 0x84},
300 {0x6f, 0xd7, 0x84},
301 {0x7f, 0xd7, 0x84},
302 {0x7f, 0xd7, 0x84},
303 {0x7f, 0xd7, 0x84},
304 {0x7f, 0xd7, 0x84},
305 {0x7f, 0xd7, 0x84}
306 };
307
308 static u8 vt3226_init_table[CB_VT3226_INIT_SEQ][3] = {
309 {0x03, 0xff, 0x80},
310 {0x02, 0x82, 0xa1},
311 {0x03, 0xc6, 0xa2},
312 {0x01, 0x97, 0x93},
313 {0x03, 0x66, 0x64},
314 {0x00, 0x61, 0xa5},
315 {0x01, 0x7b, 0xd6},
316 {0x00, 0x80, 0x17},
317 {0x03, 0xf8, 0x08},
318 {0x00, 0x02, 0x39},
319 {0x02, 0x00, 0x2a}
320 };
321
322 static u8 vt3226d0_init_table[CB_VT3226_INIT_SEQ][3] = {
323 {0x03, 0xff, 0x80},
324 {0x03, 0x02, 0x21},
325 {0x03, 0xc6, 0xa2},
326 {0x01, 0x97, 0x93},
327 {0x03, 0x66, 0x64},
328 {0x00, 0x71, 0xa5},
329 {0x01, 0x15, 0xc6},
330 {0x01, 0x2e, 0x07},
331 {0x00, 0x58, 0x08},
332 {0x00, 0x02, 0x79},
333 {0x02, 0x01, 0xaa}
334 };
335
336 static u8 vt3226_channel_table0[CB_MAX_CHANNEL_24G][3] = {
337 {0x01, 0x97, 0x83},
338 {0x01, 0x97, 0x83},
339 {0x01, 0x97, 0x93},
340 {0x01, 0x97, 0x93},
341 {0x01, 0x97, 0x93},
342 {0x01, 0x97, 0x93},
343 {0x01, 0x97, 0xa3},
344 {0x01, 0x97, 0xa3},
345 {0x01, 0x97, 0xa3},
346 {0x01, 0x97, 0xa3},
347 {0x01, 0x97, 0xb3},
348 {0x01, 0x97, 0xb3},
349 {0x01, 0x97, 0xb3},
350 {0x03, 0x37, 0xc3}
351 };
352
353 static u8 vt3226_channel_table1[CB_MAX_CHANNEL_24G][3] = {
354 {0x02, 0x66, 0x64},
355 {0x03, 0x66, 0x64},
356 {0x00, 0x66, 0x64},
357 {0x01, 0x66, 0x64},
358 {0x02, 0x66, 0x64},
359 {0x03, 0x66, 0x64},
360 {0x00, 0x66, 0x64},
361 {0x01, 0x66, 0x64},
362 {0x02, 0x66, 0x64},
363 {0x03, 0x66, 0x64},
364 {0x00, 0x66, 0x64},
365 {0x01, 0x66, 0x64},
366 {0x02, 0x66, 0x64},
367 {0x00, 0xcc, 0xc4}
368 };
369
370 static const u32 vt3226d0_lo_current_table[CB_MAX_CHANNEL_24G] = {
371 0x0135c600,
372 0x0135c600,
373 0x0235c600,
374 0x0235c600,
375 0x0235c600,
376 0x0335c600,
377 0x0335c600,
378 0x0335c600,
379 0x0335c600,
380 0x0335c600,
381 0x0335c600,
382 0x0335c600,
383 0x0335c600,
384 0x0135c600
385 };
386
387 static u8 vt3342a0_init_table[CB_VT3342_INIT_SEQ][3] = {
388 {0x03, 0xff, 0x80},
389 {0x02, 0x08, 0x81},
390 {0x00, 0xc6, 0x02},
391 {0x03, 0xc5, 0x13},
392 {0x00, 0xee, 0xe4},
393 {0x00, 0x71, 0xa5},
394 {0x01, 0x75, 0x46},
395 {0x01, 0x40, 0x27},
396 {0x01, 0x54, 0x08},
397 {0x00, 0x01, 0x69},
398 {0x02, 0x00, 0xaa},
399 {0x00, 0x08, 0xcb},
400 {0x01, 0x70, 0x0c}
401 };
402
403 static u8 vt3342_channel_table0[CB_MAX_CHANNEL][3] = {
404 {0x02, 0x05, 0x03},
405 {0x01, 0x15, 0x03},
406 {0x03, 0xc5, 0x03},
407 {0x02, 0x65, 0x03},
408 {0x01, 0x15, 0x13},
409 {0x03, 0xc5, 0x13},
410 {0x02, 0x05, 0x13},
411 {0x01, 0x15, 0x13},
412 {0x03, 0xc5, 0x13},
413 {0x02, 0x65, 0x13},
414 {0x01, 0x15, 0x23},
415 {0x03, 0xc5, 0x23},
416 {0x02, 0x05, 0x23},
417 {0x00, 0xd5, 0x23},
418 {0x01, 0x15, 0x13},
419 {0x01, 0x15, 0x13},
420 {0x01, 0x15, 0x13},
421 {0x01, 0x15, 0x13},
422 {0x01, 0x15, 0x13},
423 {0x01, 0x15, 0x13},
424 {0x01, 0x15, 0x13},
425 {0x01, 0x15, 0x13},
426 {0x01, 0x15, 0x13},
427 {0x01, 0x15, 0x13},
428 {0x01, 0x15, 0x13},
429 {0x01, 0x15, 0x13},
430 {0x01, 0x15, 0x13},
431 {0x01, 0x15, 0x13},
432 {0x01, 0x15, 0x13},
433 {0x01, 0x55, 0x63},
434 {0x01, 0x55, 0x63},
435 {0x02, 0xa5, 0x63},
436 {0x02, 0xa5, 0x63},
437 {0x00, 0x05, 0x73},
438 {0x00, 0x05, 0x73},
439 {0x01, 0x55, 0x73},
440 {0x02, 0xa5, 0x73},
441 {0x00, 0x05, 0x83},
442 {0x01, 0x55, 0x83},
443 {0x02, 0xa5, 0x83},
444 {0x02, 0xa5, 0x83},
445 {0x02, 0xa5, 0x83},
446 {0x02, 0xa5, 0x83},
447 {0x02, 0xa5, 0x83},
448 {0x02, 0xa5, 0x83},
449 {0x02, 0xa5, 0x83},
450 {0x02, 0xa5, 0x83},
451 {0x02, 0xa5, 0x83},
452 {0x02, 0xa5, 0x83},
453 {0x02, 0xa5, 0x83},
454 {0x02, 0xa5, 0x83},
455 {0x00, 0x05, 0xF3},
456 {0x01, 0x56, 0x03},
457 {0x02, 0xa6, 0x03},
458 {0x00, 0x06, 0x03},
459 {0x00, 0x06, 0x03}
460 };
461
462 static u8 vt3342_channel_table1[CB_MAX_CHANNEL][3] = {
463 {0x01, 0x99, 0x94},
464 {0x02, 0x44, 0x44},
465 {0x02, 0xee, 0xe4},
466 {0x03, 0x99, 0x94},
467 {0x00, 0x44, 0x44},
468 {0x00, 0xee, 0xe4},
469 {0x01, 0x99, 0x94},
470 {0x02, 0x44, 0x44},
471 {0x02, 0xee, 0xe4},
472 {0x03, 0x99, 0x94},
473 {0x00, 0x44, 0x44},
474 {0x00, 0xee, 0xe4},
475 {0x01, 0x99, 0x94},
476 {0x03, 0x33, 0x34},
477 {0x00, 0x44, 0x44},
478 {0x00, 0x44, 0x44},
479 {0x00, 0x44, 0x44},
480 {0x00, 0x44, 0x44},
481 {0x00, 0x44, 0x44},
482 {0x00, 0x44, 0x44},
483 {0x00, 0x44, 0x44},
484 {0x00, 0x44, 0x44},
485 {0x00, 0x44, 0x44},
486 {0x00, 0x44, 0x44},
487 {0x00, 0x44, 0x44},
488 {0x00, 0x44, 0x44},
489 {0x00, 0x44, 0x44},
490 {0x00, 0x44, 0x44},
491 {0x00, 0x44, 0x44},
492 {0x01, 0x55, 0x54},
493 {0x01, 0x55, 0x54},
494 {0x02, 0xaa, 0xa4},
495 {0x02, 0xaa, 0xa4},
496 {0x00, 0x00, 0x04},
497 {0x00, 0x00, 0x04},
498 {0x01, 0x55, 0x54},
499 {0x02, 0xaa, 0xa4},
500 {0x00, 0x00, 0x04},
501 {0x01, 0x55, 0x54},
502 {0x02, 0xaa, 0xa4},
503 {0x02, 0xaa, 0xa4},
504 {0x02, 0xaa, 0xa4},
505 {0x02, 0xaa, 0xa4},
506 {0x02, 0xaa, 0xa4},
507 {0x02, 0xaa, 0xa4},
508 {0x02, 0xaa, 0xa4},
509 {0x02, 0xaa, 0xa4},
510 {0x02, 0xaa, 0xa4},
511 {0x02, 0xaa, 0xa4},
512 {0x02, 0xaa, 0xa4},
513 {0x02, 0xaa, 0xa4},
514 {0x03, 0x00, 0x04},
515 {0x00, 0x55, 0x54},
516 {0x01, 0xaa, 0xa4},
517 {0x03, 0x00, 0x04},
518 {0x03, 0x00, 0x04}
519 };
520
521
522 static const u32 al2230_power_table[AL2230_PWR_IDX_LEN] = {
523 0x04040900,
524 0x04041900,
525 0x04042900,
526 0x04043900,
527 0x04044900,
528 0x04045900,
529 0x04046900,
530 0x04047900,
531 0x04048900,
532 0x04049900,
533 0x0404a900,
534 0x0404b900,
535 0x0404c900,
536 0x0404d900,
537 0x0404e900,
538 0x0404f900,
539 0x04050900,
540 0x04051900,
541 0x04052900,
542 0x04053900,
543 0x04054900,
544 0x04055900,
545 0x04056900,
546 0x04057900,
547 0x04058900,
548 0x04059900,
549 0x0405a900,
550 0x0405b900,
551 0x0405c900,
552 0x0405d900,
553 0x0405e900,
554 0x0405f900,
555 0x04060900,
556 0x04061900,
557 0x04062900,
558 0x04063900,
559 0x04064900,
560 0x04065900,
561 0x04066900,
562 0x04067900,
563 0x04068900,
564 0x04069900,
565 0x0406a900,
566 0x0406b900,
567 0x0406c900,
568 0x0406d900,
569 0x0406e900,
570 0x0406f900,
571 0x04070900,
572 0x04071900,
573 0x04072900,
574 0x04073900,
575 0x04074900,
576 0x04075900,
577 0x04076900,
578 0x04077900,
579 0x04078900,
580 0x04079900,
581 0x0407a900,
582 0x0407b900,
583 0x0407c900,
584 0x0407d900,
585 0x0407e900,
586 0x0407f900
587 };
588
589
590
591
592 int vnt_rf_write_embedded(struct vnt_private *priv, u32 data)
593 {
594 u8 reg_data[4];
595
596 data |= (VNT_RF_REG_LEN << 3) | IFREGCTL_REGW;
597
598 reg_data[0] = (u8)data;
599 reg_data[1] = (u8)(data >> 8);
600 reg_data[2] = (u8)(data >> 16);
601 reg_data[3] = (u8)(data >> 24);
602
603 vnt_control_out(priv, MESSAGE_TYPE_WRITE_IFRF,
604 0, 0, ARRAY_SIZE(reg_data), reg_data);
605
606 return true;
607 }
608
609
610 int vnt_rf_setpower(struct vnt_private *priv, u32 rate, u32 channel)
611 {
612 u8 power = priv->cck_pwr;
613
614 if (channel == 0)
615 return -EINVAL;
616
617 switch (rate) {
618 case RATE_1M:
619 case RATE_2M:
620 case RATE_5M:
621 case RATE_11M:
622 channel--;
623
624 if (channel < sizeof(priv->cck_pwr_tbl))
625 power = priv->cck_pwr_tbl[channel];
626 break;
627 case RATE_6M:
628 case RATE_9M:
629 case RATE_12M:
630 case RATE_18M:
631 case RATE_24M:
632 case RATE_36M:
633 case RATE_48M:
634 case RATE_54M:
635 if (channel > CB_MAX_CHANNEL_24G)
636 power = priv->ofdm_a_pwr_tbl[channel - 15];
637 else
638 power = priv->ofdm_pwr_tbl[channel - 1];
639 break;
640 }
641
642 return vnt_rf_set_txpower(priv, power, rate);
643 }
644
645 static u8 vnt_rf_addpower(struct vnt_private *priv)
646 {
647 s32 rssi = -priv->current_rssi;
648
649 if (!rssi)
650 return 7;
651
652 if (priv->rf_type == RF_VT3226D0) {
653 if (rssi < -70)
654 return 9;
655 else if (rssi < -65)
656 return 7;
657 else if (rssi < -60)
658 return 5;
659 } else {
660 if (rssi < -80)
661 return 9;
662 else if (rssi < -75)
663 return 7;
664 else if (rssi < -70)
665 return 5;
666 }
667
668 return 0;
669 }
670
671
672 int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate)
673 {
674 u32 power_setting = 0;
675 int ret = true;
676
677 power += vnt_rf_addpower(priv);
678 if (power > VNT_RF_MAX_POWER)
679 power = VNT_RF_MAX_POWER;
680
681 if (priv->power == power)
682 return true;
683
684 priv->power = power;
685
686 switch (priv->rf_type) {
687 case RF_AL2230:
688 if (power >= AL2230_PWR_IDX_LEN)
689 return false;
690
691 ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]);
692
693 if (rate <= RATE_11M)
694 ret &= vnt_rf_write_embedded(priv, 0x0001b400);
695 else
696 ret &= vnt_rf_write_embedded(priv, 0x0005a400);
697 break;
698 case RF_AL2230S:
699 if (power >= AL2230_PWR_IDX_LEN)
700 return false;
701
702 ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]);
703
704 if (rate <= RATE_11M) {
705 ret &= vnt_rf_write_embedded(priv, 0x040c1400);
706 ret &= vnt_rf_write_embedded(priv, 0x00299b00);
707 } else {
708 ret &= vnt_rf_write_embedded(priv, 0x0005a400);
709 ret &= vnt_rf_write_embedded(priv, 0x00099b00);
710 }
711 break;
712
713 case RF_AIROHA7230:
714 if (rate <= RATE_11M)
715 ret &= vnt_rf_write_embedded(priv, 0x111bb900);
716 else
717 ret &= vnt_rf_write_embedded(priv, 0x221bb900);
718
719 if (power >= AL7230_PWR_IDX_LEN)
720 return false;
721
722
723
724
725
726 power_setting = 0x080c0b00 | (power << 12);
727
728 ret &= vnt_rf_write_embedded(priv, power_setting);
729
730 break;
731
732 case RF_VT3226:
733 if (power >= VT3226_PWR_IDX_LEN)
734 return false;
735 power_setting = ((0x3f - power) << 20) | (0x17 << 8);
736
737 ret &= vnt_rf_write_embedded(priv, power_setting);
738
739 break;
740 case RF_VT3226D0:
741 if (power >= VT3226_PWR_IDX_LEN)
742 return false;
743
744 if (rate <= RATE_11M) {
745 u16 hw_value = priv->hw->conf.chandef.chan->hw_value;
746
747 power_setting = ((0x3f - power) << 20) | (0xe07 << 8);
748
749 ret &= vnt_rf_write_embedded(priv, power_setting);
750 ret &= vnt_rf_write_embedded(priv, 0x03c6a200);
751
752 dev_dbg(&priv->usb->dev,
753 "%s 11b channel [%d]\n", __func__, hw_value);
754
755 hw_value--;
756
757 if (hw_value < ARRAY_SIZE(vt3226d0_lo_current_table))
758 ret &= vnt_rf_write_embedded(priv,
759 vt3226d0_lo_current_table[hw_value]);
760
761 ret &= vnt_rf_write_embedded(priv, 0x015C0800);
762 } else {
763 dev_dbg(&priv->usb->dev,
764 "@@@@ %s> 11G mode\n", __func__);
765
766 power_setting = ((0x3f - power) << 20) | (0x7 << 8);
767
768 ret &= vnt_rf_write_embedded(priv, power_setting);
769 ret &= vnt_rf_write_embedded(priv, 0x00C6A200);
770 ret &= vnt_rf_write_embedded(priv, 0x016BC600);
771 ret &= vnt_rf_write_embedded(priv, 0x00900800);
772 }
773 break;
774
775 case RF_VT3342A0:
776 if (power >= VT3342_PWR_IDX_LEN)
777 return false;
778
779 power_setting = ((0x3f - power) << 20) | (0x27 << 8);
780
781 ret &= vnt_rf_write_embedded(priv, power_setting);
782
783 break;
784 default:
785 break;
786 }
787 return ret;
788 }
789
790
791 void vnt_rf_rssi_to_dbm(struct vnt_private *priv, u8 rssi, long *dbm)
792 {
793 u8 idx = ((rssi & 0xc0) >> 6) & 0x03;
794 long b = rssi & 0x3f;
795 long a = 0;
796 u8 airoharf[4] = {0, 18, 0, 40};
797
798 switch (priv->rf_type) {
799 case RF_AL2230:
800 case RF_AL2230S:
801 case RF_AIROHA7230:
802 case RF_VT3226:
803 case RF_VT3226D0:
804 case RF_VT3342A0:
805 a = airoharf[idx];
806 break;
807 default:
808 break;
809 }
810
811 *dbm = -1 * (a + b * 2);
812 }
813
814 int vnt_rf_table_download(struct vnt_private *priv)
815 {
816 int ret = 0;
817 u16 length1 = 0, length2 = 0, length3 = 0;
818 u8 *addr1 = NULL, *addr2 = NULL, *addr3 = NULL;
819 u16 length, value;
820 u8 array[256];
821
822 switch (priv->rf_type) {
823 case RF_AL2230:
824 case RF_AL2230S:
825 length1 = CB_AL2230_INIT_SEQ * 3;
826 length2 = CB_MAX_CHANNEL_24G * 3;
827 length3 = CB_MAX_CHANNEL_24G * 3;
828 addr1 = &al2230_init_table[0][0];
829 addr2 = &al2230_channel_table0[0][0];
830 addr3 = &al2230_channel_table1[0][0];
831 break;
832 case RF_AIROHA7230:
833 length1 = CB_AL7230_INIT_SEQ * 3;
834 length2 = CB_MAX_CHANNEL * 3;
835 length3 = CB_MAX_CHANNEL * 3;
836 addr1 = &al7230_init_table[0][0];
837 addr2 = &al7230_channel_table0[0][0];
838 addr3 = &al7230_channel_table1[0][0];
839 break;
840 case RF_VT3226:
841 length1 = CB_VT3226_INIT_SEQ * 3;
842 length2 = CB_MAX_CHANNEL_24G * 3;
843 length3 = CB_MAX_CHANNEL_24G * 3;
844 addr1 = &vt3226_init_table[0][0];
845 addr2 = &vt3226_channel_table0[0][0];
846 addr3 = &vt3226_channel_table1[0][0];
847 break;
848 case RF_VT3226D0:
849 length1 = CB_VT3226_INIT_SEQ * 3;
850 length2 = CB_MAX_CHANNEL_24G * 3;
851 length3 = CB_MAX_CHANNEL_24G * 3;
852 addr1 = &vt3226d0_init_table[0][0];
853 addr2 = &vt3226_channel_table0[0][0];
854 addr3 = &vt3226_channel_table1[0][0];
855 break;
856 case RF_VT3342A0:
857 length1 = CB_VT3342_INIT_SEQ * 3;
858 length2 = CB_MAX_CHANNEL * 3;
859 length3 = CB_MAX_CHANNEL * 3;
860 addr1 = &vt3342a0_init_table[0][0];
861 addr2 = &vt3342_channel_table0[0][0];
862 addr3 = &vt3342_channel_table1[0][0];
863 break;
864 }
865
866
867 memcpy(array, addr1, length1);
868
869 ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
870 MESSAGE_REQUEST_RF_INIT, length1, array);
871 if (ret)
872 goto end;
873
874
875 value = 0;
876 while (length2 > 0) {
877 if (length2 >= 64)
878 length = 64;
879 else
880 length = length2;
881
882 memcpy(array, addr2, length);
883
884 ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, value,
885 MESSAGE_REQUEST_RF_CH0, length, array);
886 if (ret)
887 goto end;
888
889 length2 -= length;
890 value += length;
891 addr2 += length;
892 }
893
894
895 value = 0;
896 while (length3 > 0) {
897 if (length3 >= 64)
898 length = 64;
899 else
900 length = length3;
901
902 memcpy(array, addr3, length);
903
904 ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, value,
905 MESSAGE_REQUEST_RF_CH1, length, array);
906 if (ret)
907 goto end;
908
909 length3 -= length;
910 value += length;
911 addr3 += length;
912 }
913
914 if (priv->rf_type == RF_AIROHA7230) {
915 length1 = CB_AL7230_INIT_SEQ * 3;
916 length2 = CB_MAX_CHANNEL * 3;
917 addr1 = &al7230_init_table_amode[0][0];
918 addr2 = &al7230_channel_table2[0][0];
919
920 memcpy(array, addr1, length1);
921
922
923 ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
924 MESSAGE_REQUEST_RF_INIT2, length1, array);
925 if (ret)
926 goto end;
927
928
929 value = 0;
930 while (length2 > 0) {
931 if (length2 >= 64)
932 length = 64;
933 else
934 length = length2;
935
936 memcpy(array, addr2, length);
937
938 ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, value,
939 MESSAGE_REQUEST_RF_CH2, length,
940 array);
941 if (ret)
942 goto end;
943
944 length2 -= length;
945 value += length;
946 addr2 += length;
947 }
948 }
949
950 end:
951 return ret;
952 }