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