]> git.karo-electronics.de Git - linux-beck.git/blob - drivers/staging/vt6656/rf.c
spi: Remove support for legacy PM
[linux-beck.git] / 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_18M:
644         case RATE_24M:
645         case RATE_36M:
646         case RATE_48M:
647         case RATE_54M:
648                 if (channel > CB_MAX_CHANNEL_24G)
649                         power = priv->ofdm_a_pwr_tbl[channel-15];
650                 else
651                         power = priv->ofdm_pwr_tbl[channel-1];
652                 break;
653         }
654
655         return vnt_rf_set_txpower(priv, power, rate);
656 }
657
658 static u8 vnt_rf_addpower(struct vnt_private *priv)
659 {
660         s32 rssi = -priv->current_rssi;
661
662         if (!rssi)
663                 return 7;
664
665         if (priv->rf_type == RF_VT3226D0) {
666                 if (rssi < -70)
667                         return 9;
668                 else if (rssi < -65)
669                         return 7;
670                 else if (rssi < -60)
671                         return 5;
672         } else {
673                 if (rssi < -80)
674                         return 9;
675                 else if (rssi < -75)
676                         return 7;
677                 else if (rssi < -70)
678                         return 5;
679         }
680
681         return 0;
682 }
683
684 /* Set Tx power by power level and rate */
685 int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate)
686 {
687         u32 power_setting = 0;
688         int ret = true;
689
690         power += vnt_rf_addpower(priv);
691         if (power > VNT_RF_MAX_POWER)
692                 power = VNT_RF_MAX_POWER;
693
694         if (priv->power == power)
695                 return true;
696
697         priv->power = power;
698
699         switch (priv->rf_type) {
700         case RF_AL2230:
701                 if (power >= AL2230_PWR_IDX_LEN)
702                         return false;
703
704                 ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]);
705
706                 if (rate <= RATE_11M)
707                         ret &= vnt_rf_write_embedded(priv, 0x0001b400);
708                 else
709                         ret &= vnt_rf_write_embedded(priv, 0x0005a400);
710                 break;
711         case RF_AL2230S:
712                 if (power >= AL2230_PWR_IDX_LEN)
713                         return false;
714
715                 ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]);
716
717                 if (rate <= RATE_11M) {
718                         ret &= vnt_rf_write_embedded(priv, 0x040c1400);
719                         ret &= vnt_rf_write_embedded(priv, 0x00299b00);
720                 } else {
721                         ret &= vnt_rf_write_embedded(priv, 0x0005a400);
722                         ret &= vnt_rf_write_embedded(priv, 0x00099b00);
723                 }
724                 break;
725
726         case RF_AIROHA7230:
727                 if (rate <= RATE_11M)
728                         ret &= vnt_rf_write_embedded(priv, 0x111bb900);
729                 else
730                         ret &= vnt_rf_write_embedded(priv, 0x221bb900);
731
732                 if (power >= AL7230_PWR_IDX_LEN)
733                         return false;
734
735                 /*
736                 * 0x080F1B00 for 3 wire control TxGain(D10)
737                 * and 0x31 as TX Gain value
738                 */
739                 power_setting = 0x080c0b00 | (power << 12);
740
741                 ret &= vnt_rf_write_embedded(priv, power_setting);
742
743                 break;
744
745         case RF_VT3226:
746                 if (power >= VT3226_PWR_IDX_LEN)
747                         return false;
748                 power_setting = ((0x3f - power) << 20) | (0x17 << 8);
749
750                 ret &= vnt_rf_write_embedded(priv, power_setting);
751
752                 break;
753         case RF_VT3226D0:
754                 if (power >= VT3226_PWR_IDX_LEN)
755                         return false;
756
757                 if (rate <= RATE_11M) {
758                         u16 hw_value = priv->hw->conf.chandef.chan->hw_value;
759
760                         power_setting = ((0x3f - power) << 20) | (0xe07 << 8);
761
762                         ret &= vnt_rf_write_embedded(priv, power_setting);
763                         ret &= vnt_rf_write_embedded(priv, 0x03c6a200);
764
765                         dev_dbg(&priv->usb->dev,
766                                 "%s 11b channel [%d]\n", __func__, hw_value);
767
768                         hw_value--;
769
770                         if (hw_value < ARRAY_SIZE(vt3226d0_lo_current_table))
771                                 ret &= vnt_rf_write_embedded(priv,
772                                         vt3226d0_lo_current_table[hw_value]);
773
774                         ret &= vnt_rf_write_embedded(priv, 0x015C0800);
775                 } else {
776                         dev_dbg(&priv->usb->dev,
777                                         "@@@@ vnt_rf_set_txpower> 11G mode\n");
778
779                         power_setting = ((0x3f - power) << 20) | (0x7 << 8);
780
781                         ret &= vnt_rf_write_embedded(priv, power_setting);
782                         ret &= vnt_rf_write_embedded(priv, 0x00C6A200);
783                         ret &= vnt_rf_write_embedded(priv, 0x016BC600);
784                         ret &= vnt_rf_write_embedded(priv, 0x00900800);
785                 }
786                 break;
787
788         case RF_VT3342A0:
789                 if (power >= VT3342_PWR_IDX_LEN)
790                         return false;
791
792                 power_setting =  ((0x3f - power) << 20) | (0x27 << 8);
793
794                 ret &= vnt_rf_write_embedded(priv, power_setting);
795
796                 break;
797         default:
798                 break;
799         }
800         return ret;
801 }
802
803 /* Convert rssi to dbm */
804 void vnt_rf_rssi_to_dbm(struct vnt_private *priv, u8 rssi, long *dbm)
805 {
806         u8 idx = (((rssi & 0xc0) >> 6) & 0x03);
807         long b = (rssi & 0x3f);
808         long a = 0;
809         u8 airoharf[4] = {0, 18, 0, 40};
810
811         switch (priv->rf_type) {
812         case RF_AL2230:
813         case RF_AL2230S:
814         case RF_AIROHA7230:
815         case RF_VT3226:
816         case RF_VT3226D0:
817         case RF_VT3342A0:
818                 a = airoharf[idx];
819                 break;
820         default:
821                 break;
822         }
823
824         *dbm = -1 * (a + b * 2);
825 }
826
827 void vnt_rf_table_download(struct vnt_private *priv)
828 {
829         u16 length1 = 0, length2 = 0, length3 = 0;
830         u8 *addr1 = NULL, *addr2 = NULL, *addr3 = NULL;
831         u16 length, value;
832         u8 array[256];
833
834         switch (priv->rf_type) {
835         case RF_AL2230:
836         case RF_AL2230S:
837                 length1 = CB_AL2230_INIT_SEQ * 3;
838                 length2 = CB_MAX_CHANNEL_24G * 3;
839                 length3 = CB_MAX_CHANNEL_24G * 3;
840                 addr1 = &al2230_init_table[0][0];
841                 addr2 = &al2230_channel_table0[0][0];
842                 addr3 = &al2230_channel_table1[0][0];
843                 break;
844         case RF_AIROHA7230:
845                 length1 = CB_AL7230_INIT_SEQ * 3;
846                 length2 = CB_MAX_CHANNEL * 3;
847                 length3 = CB_MAX_CHANNEL * 3;
848                 addr1 = &al7230_init_table[0][0];
849                 addr2 = &al7230_channel_table0[0][0];
850                 addr3 = &al7230_channel_table1[0][0];
851                 break;
852         case RF_VT3226:
853                 length1 = CB_VT3226_INIT_SEQ * 3;
854                 length2 = CB_MAX_CHANNEL_24G * 3;
855                 length3 = CB_MAX_CHANNEL_24G * 3;
856                 addr1 = &vt3226_init_table[0][0];
857                 addr2 = &vt3226_channel_table0[0][0];
858                 addr3 = &vt3226_channel_table1[0][0];
859                 break;
860         case RF_VT3226D0:
861                 length1 = CB_VT3226_INIT_SEQ * 3;
862                 length2 = CB_MAX_CHANNEL_24G * 3;
863                 length3 = CB_MAX_CHANNEL_24G * 3;
864                 addr1 = &vt3226d0_init_table[0][0];
865                 addr2 = &vt3226_channel_table0[0][0];
866                 addr3 = &vt3226_channel_table1[0][0];
867                 break;
868         case RF_VT3342A0:
869                 length1 = CB_VT3342_INIT_SEQ * 3;
870                 length2 = CB_MAX_CHANNEL * 3;
871                 length3 = CB_MAX_CHANNEL * 3;
872                 addr1 = &vt3342a0_init_table[0][0];
873                 addr2 = &vt3342_channel_table0[0][0];
874                 addr3 = &vt3342_channel_table1[0][0];
875                 break;
876         }
877
878         /* Init Table */
879         memcpy(array, addr1, length1);
880
881         vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
882                 MESSAGE_REQUEST_RF_INIT, length1, array);
883
884         /* Channel Table 0 */
885         value = 0;
886         while (length2 > 0) {
887                 if (length2 >= 64)
888                         length = 64;
889                 else
890                         length = length2;
891
892                 memcpy(array, addr2, length);
893
894                 vnt_control_out(priv, MESSAGE_TYPE_WRITE,
895                         value, MESSAGE_REQUEST_RF_CH0, length, array);
896
897                 length2 -= length;
898                 value += length;
899                 addr2 += length;
900         }
901
902         /* Channel table 1 */
903         value = 0;
904         while (length3 > 0) {
905                 if (length3 >= 64)
906                         length = 64;
907                 else
908                         length = length3;
909
910                 memcpy(array, addr3, length);
911
912                 vnt_control_out(priv, MESSAGE_TYPE_WRITE,
913                         value, MESSAGE_REQUEST_RF_CH1, length, array);
914
915                 length3 -= length;
916                 value += length;
917                 addr3 += length;
918         }
919
920         if (priv->rf_type == RF_AIROHA7230) {
921                 length1 = CB_AL7230_INIT_SEQ * 3;
922                 length2 = CB_MAX_CHANNEL * 3;
923                 addr1 = &(al7230_init_table_amode[0][0]);
924                 addr2 = &(al7230_channel_table2[0][0]);
925
926                 memcpy(array, addr1, length1);
927
928                 /* Init Table 2 */
929                 vnt_control_out(priv, MESSAGE_TYPE_WRITE,
930                         0, MESSAGE_REQUEST_RF_INIT2, length1, array);
931
932                 /* Channel Table 0 */
933                 value = 0;
934                 while (length2 > 0) {
935                         if (length2 >= 64)
936                                 length = 64;
937                         else
938                                 length = length2;
939
940                         memcpy(array, addr2, length);
941
942                         vnt_control_out(priv, MESSAGE_TYPE_WRITE,
943                                 value, MESSAGE_REQUEST_RF_CH2, length, array);
944
945                         length2 -= length;
946                         value += length;
947                         addr2 += length;
948                 }
949         }
950 }