Merge tag 'perf-tools-2020-12-24' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / staging / vt6656 / rf.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
4  * All rights reserved.
5  *
6  * File: rf.c
7  *
8  * Purpose: rf function code
9  *
10  * Author: Jerry Chen
11  *
12  * Date: Feb. 19, 2004
13  *
14  * Functions:
15  *      vnt_rf_write_embedded   - Embedded write RF register via MAC
16  *
17  * Revision History:
18  *      RF_VT3226: RobertYu:20051111, VT3226C0 and before
19  *      RF_VT3226D0: RobertYu:20051228
20  *      RF_VT3342A0: RobertYu:20060609
21  *
22  */
23
24 #include <linux/errno.h>
25 #include "mac.h"
26 #include "rf.h"
27 #include "baseband.h"
28 #include "usbpipe.h"
29
30 #define CB_AL2230_INIT_SEQ    15
31 #define CB_AL7230_INIT_SEQ    16
32 #define CB_VT3226_INIT_SEQ    11
33 #define CB_VT3342_INIT_SEQ    13
34
35 static u8 al2230_init_table[CB_AL2230_INIT_SEQ][3] = {
36         {0x03, 0xf7, 0x90},
37         {0x03, 0x33, 0x31},
38         {0x01, 0xb8, 0x02},
39         {0x00, 0xff, 0xf3},
40         {0x00, 0x05, 0xa4},
41         {0x0f, 0x4d, 0xc5},
42         {0x08, 0x05, 0xb6},
43         {0x01, 0x47, 0xc7},
44         {0x00, 0x06, 0x88},
45         {0x04, 0x03, 0xb9},
46         {0x00, 0xdb, 0xba},
47         {0x00, 0x09, 0x9b},
48         {0x0b, 0xdf, 0xfc},
49         {0x00, 0x00, 0x0d},
50         {0x00, 0x58, 0x0f}
51 };
52
53 static u8 al2230_channel_table0[CB_MAX_CHANNEL_24G][3] = {
54         {0x03, 0xf7, 0x90},
55         {0x03, 0xf7, 0x90},
56         {0x03, 0xe7, 0x90},
57         {0x03, 0xe7, 0x90},
58         {0x03, 0xf7, 0xa0},
59         {0x03, 0xf7, 0xa0},
60         {0x03, 0xe7, 0xa0},
61         {0x03, 0xe7, 0xa0},
62         {0x03, 0xf7, 0xb0},
63         {0x03, 0xf7, 0xb0},
64         {0x03, 0xe7, 0xb0},
65         {0x03, 0xe7, 0xb0},
66         {0x03, 0xf7, 0xc0},
67         {0x03, 0xe7, 0xc0}
68 };
69
70 static u8 al2230_channel_table1[CB_MAX_CHANNEL_24G][3] = {
71         {0x03, 0x33, 0x31},
72         {0x0b, 0x33, 0x31},
73         {0x03, 0x33, 0x31},
74         {0x0b, 0x33, 0x31},
75         {0x03, 0x33, 0x31},
76         {0x0b, 0x33, 0x31},
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         {0x06, 0x66, 0x61}
85 };
86
87 static u8 al7230_init_table[CB_AL7230_INIT_SEQ][3] = {
88         {0x20, 0x37, 0x90},
89         {0x13, 0x33, 0x31},
90         {0x84, 0x1f, 0xf2},
91         {0x3f, 0xdf, 0xa3},
92         {0x7f, 0xd7, 0x84},
93         {0x80, 0x2b, 0x55},
94         {0x56, 0xaf, 0x36},
95         {0xce, 0x02, 0x07},
96         {0x6e, 0xbc, 0x98},
97         {0x22, 0x1b, 0xb9},
98         {0xe0, 0x00, 0x0a},
99         {0x08, 0x03, 0x1b},
100         {0x00, 0x0a, 0x3c},
101         {0xff, 0xff, 0xfd},
102         {0x00, 0x00, 0x0e},
103         {0x1a, 0xba, 0x8f}
104 };
105
106 static u8 al7230_init_table_amode[CB_AL7230_INIT_SEQ][3] = {
107         {0x2f, 0xf5, 0x20},
108         {0x00, 0x00, 0x01},
109         {0x45, 0x1f, 0xe2},
110         {0x5f, 0xdf, 0xa3},
111         {0x6f, 0xd7, 0x84},
112         {0x85, 0x3f, 0x55},
113         {0x56, 0xaf, 0x36},
114         {0xce, 0x02, 0x07},
115         {0x6e, 0xbc, 0x98},
116         {0x22, 0x1b, 0xb9},
117         {0xe0, 0x60, 0x0a},
118         {0x08, 0x03, 0x1b},
119         {0x00, 0x14, 0x7c},
120         {0xff, 0xff, 0xfd},
121         {0x00, 0x00, 0x0e},
122         {0x12, 0xba, 0xcf}
123 };
124
125 static u8 al7230_channel_table0[CB_MAX_CHANNEL][3] = {
126         {0x20, 0x37, 0x90},
127         {0x20, 0x37, 0x90},
128         {0x20, 0x37, 0x90},
129         {0x20, 0x37, 0x90},
130         {0x20, 0x37, 0xa0},
131         {0x20, 0x37, 0xa0},
132         {0x20, 0x37, 0xa0},
133         {0x20, 0x37, 0xa0},
134         {0x20, 0x37, 0xb0},
135         {0x20, 0x37, 0xb0},
136         {0x20, 0x37, 0xb0},
137         {0x20, 0x37, 0xb0},
138         {0x20, 0x37, 0xc0},
139         {0x20, 0x37, 0xc0},
140         {0x0f, 0xf5, 0x20}, /* channel 15 Tf = 4915MHz */
141         {0x2f, 0xf5, 0x20},
142         {0x0f, 0xf5, 0x20},
143         {0x0f, 0xf5, 0x20},
144         {0x2f, 0xf5, 0x20},
145         {0x0f, 0xf5, 0x20},
146         {0x2f, 0xf5, 0x30},
147         {0x2f, 0xf5, 0x30},
148         {0x0f, 0xf5, 0x40},
149         {0x2f, 0xf5, 0x40},
150         {0x0f, 0xf5, 0x40},
151         {0x0f, 0xf5, 0x40},
152         {0x2f, 0xf5, 0x40},
153         {0x2f, 0xf5, 0x50},
154         {0x2f, 0xf5, 0x60},
155         {0x2f, 0xf5, 0x60},
156         {0x2f, 0xf5, 0x70},
157         {0x2f, 0xf5, 0x70},
158         {0x2f, 0xf5, 0x70},
159         {0x2f, 0xf5, 0x70},
160         {0x2f, 0xf5, 0x70},
161         {0x2f, 0xf5, 0x70},
162         {0x2f, 0xf5, 0x80},
163         {0x2f, 0xf5, 0x80},
164         {0x2f, 0xf5, 0x80},
165         {0x2f, 0xf5, 0x90},
166         {0x2f, 0xf5, 0xc0},
167         {0x2f, 0xf5, 0xc0},
168         {0x2f, 0xf5, 0xc0},
169         {0x2f, 0xf5, 0xd0},
170         {0x2f, 0xf5, 0xd0},
171         {0x2f, 0xf5, 0xd0},
172         {0x2f, 0xf5, 0xe0},
173         {0x2f, 0xf5, 0xe0},
174         {0x2f, 0xf5, 0xe0},
175         {0x2f, 0xf5, 0xf0},
176         {0x2f, 0xf5, 0xf0},
177         {0x2f, 0xf6, 0x00},
178         {0x2f, 0xf6, 0x00},
179         {0x2f, 0xf6, 0x00},
180         {0x2f, 0xf6, 0x10},
181         {0x2f, 0xf6, 0x10}
182 };
183
184 static u8 al7230_channel_table1[CB_MAX_CHANNEL][3] = {
185         {0x13, 0x33, 0x31},
186         {0x1b, 0x33, 0x31},
187         {0x03, 0x33, 0x31},
188         {0x0b, 0x33, 0x31},
189         {0x13, 0x33, 0x31},
190         {0x1b, 0x33, 0x31},
191         {0x03, 0x33, 0x31},
192         {0x0b, 0x33, 0x31},
193         {0x13, 0x33, 0x31},
194         {0x1b, 0x33, 0x31},
195         {0x03, 0x33, 0x31},
196         {0x0b, 0x33, 0x31},
197         {0x13, 0x33, 0x31},
198         {0x06, 0x66, 0x61},
199         {0x1d, 0x55, 0x51}, /* channel = 15, Tf = 4915MHz */
200         {0x00, 0x00, 0x01},
201         {0x02, 0xaa, 0xa1},
202         {0x08, 0x00, 0x01},
203         {0x0a, 0xaa, 0xa1},
204         {0x0d, 0x55, 0x51},
205         {0x15, 0x55, 0x51},
206         {0x00, 0x00, 0x01},
207         {0x1d, 0x55, 0x51},
208         {0x00, 0x00, 0x01},
209         {0x02, 0xaa, 0xa1},
210         {0x08, 0x00, 0x01},
211         {0x0a, 0xaa, 0xa1},
212         {0x15, 0x55, 0x51},
213         {0x05, 0x55, 0x51},
214         {0x0a, 0xaa, 0xa1},
215         {0x10, 0x00, 0x01},
216         {0x15, 0x55, 0x51},
217         {0x1a, 0xaa, 0xa1},
218         {0x00, 0x00, 0x01},
219         {0x05, 0x55, 0x51},
220         {0x0a, 0xaa, 0xa1},
221         {0x15, 0x55, 0x51},
222         {0x00, 0x00, 0x01},
223         {0x0a, 0xaa, 0xa1},
224         {0x15, 0x55, 0x51},
225         {0x15, 0x55, 0x51},
226         {0x00, 0x00, 0x01},
227         {0x0a, 0xaa, 0xa1},
228         {0x15, 0x55, 0x51},
229         {0x00, 0x00, 0x01},
230         {0x0a, 0xaa, 0xa1},
231         {0x15, 0x55, 0x51},
232         {0x00, 0x00, 0x01},
233         {0x0a, 0xaa, 0xa1},
234         {0x15, 0x55, 0x51},
235         {0x00, 0x00, 0x01},
236         {0x18, 0x00, 0x01},
237         {0x02, 0xaa, 0xa1},
238         {0x0d, 0x55, 0x51},
239         {0x18, 0x00, 0x01},
240         {0x02, 0xaa, 0xb1}
241 };
242
243 static u8 al7230_channel_table2[CB_MAX_CHANNEL][3] = {
244         {0x7f, 0xd7, 0x84},
245         {0x7f, 0xd7, 0x84},
246         {0x7f, 0xd7, 0x84},
247         {0x7f, 0xd7, 0x84},
248         {0x7f, 0xd7, 0x84},
249         {0x7f, 0xd7, 0x84},
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}, /* channel = 15 Tf = 4915MHz */
259         {0x6f, 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         {0x6f, 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         {0x6f, 0xd7, 0x84},
278         {0x7f, 0xd7, 0x84},
279         {0x7f, 0xd7, 0x84},
280         {0x7f, 0xd7, 0x84},
281         {0x6f, 0xd7, 0x84},
282         {0x7f, 0xd7, 0x84},
283         {0x7f, 0xd7, 0x84},
284         {0x7f, 0xd7, 0x84},
285         {0x6f, 0xd7, 0x84},
286         {0x7f, 0xd7, 0x84},
287         {0x7f, 0xd7, 0x84},
288         {0x6f, 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         {0x7f, 0xd7, 0x84},
298         {0x7f, 0xd7, 0x84},
299         {0x7f, 0xd7, 0x84}
300 };
301
302 static u8 vt3226_init_table[CB_VT3226_INIT_SEQ][3] = {
303         {0x03, 0xff, 0x80},
304         {0x02, 0x82, 0xa1},
305         {0x03, 0xc6, 0xa2},
306         {0x01, 0x97, 0x93},
307         {0x03, 0x66, 0x64},
308         {0x00, 0x61, 0xa5},
309         {0x01, 0x7b, 0xd6},
310         {0x00, 0x80, 0x17},
311         {0x03, 0xf8, 0x08},
312         {0x00, 0x02, 0x39},
313         {0x02, 0x00, 0x2a}
314 };
315
316 static u8 vt3226d0_init_table[CB_VT3226_INIT_SEQ][3] = {
317         {0x03, 0xff, 0x80},
318         {0x03, 0x02, 0x21},
319         {0x03, 0xc6, 0xa2},
320         {0x01, 0x97, 0x93},
321         {0x03, 0x66, 0x64},
322         {0x00, 0x71, 0xa5},
323         {0x01, 0x15, 0xc6},
324         {0x01, 0x2e, 0x07},
325         {0x00, 0x58, 0x08},
326         {0x00, 0x02, 0x79},
327         {0x02, 0x01, 0xaa}
328 };
329
330 static u8 vt3226_channel_table0[CB_MAX_CHANNEL_24G][3] = {
331         {0x01, 0x97, 0x83},
332         {0x01, 0x97, 0x83},
333         {0x01, 0x97, 0x93},
334         {0x01, 0x97, 0x93},
335         {0x01, 0x97, 0x93},
336         {0x01, 0x97, 0x93},
337         {0x01, 0x97, 0xa3},
338         {0x01, 0x97, 0xa3},
339         {0x01, 0x97, 0xa3},
340         {0x01, 0x97, 0xa3},
341         {0x01, 0x97, 0xb3},
342         {0x01, 0x97, 0xb3},
343         {0x01, 0x97, 0xb3},
344         {0x03, 0x37, 0xc3}
345 };
346
347 static u8 vt3226_channel_table1[CB_MAX_CHANNEL_24G][3] = {
348         {0x02, 0x66, 0x64},
349         {0x03, 0x66, 0x64},
350         {0x00, 0x66, 0x64},
351         {0x01, 0x66, 0x64},
352         {0x02, 0x66, 0x64},
353         {0x03, 0x66, 0x64},
354         {0x00, 0x66, 0x64},
355         {0x01, 0x66, 0x64},
356         {0x02, 0x66, 0x64},
357         {0x03, 0x66, 0x64},
358         {0x00, 0x66, 0x64},
359         {0x01, 0x66, 0x64},
360         {0x02, 0x66, 0x64},
361         {0x00, 0xcc, 0xc4}
362 };
363
364 static const u32 vt3226d0_lo_current_table[CB_MAX_CHANNEL_24G] = {
365         0x0135c600,
366         0x0135c600,
367         0x0235c600,
368         0x0235c600,
369         0x0235c600,
370         0x0335c600,
371         0x0335c600,
372         0x0335c600,
373         0x0335c600,
374         0x0335c600,
375         0x0335c600,
376         0x0335c600,
377         0x0335c600,
378         0x0135c600
379 };
380
381 static u8 vt3342a0_init_table[CB_VT3342_INIT_SEQ][3] = { /* 11b/g mode */
382         {0x03, 0xff, 0x80},
383         {0x02, 0x08, 0x81},
384         {0x00, 0xc6, 0x02},
385         {0x03, 0xc5, 0x13},
386         {0x00, 0xee, 0xe4},
387         {0x00, 0x71, 0xa5},
388         {0x01, 0x75, 0x46},
389         {0x01, 0x40, 0x27},
390         {0x01, 0x54, 0x08},
391         {0x00, 0x01, 0x69},
392         {0x02, 0x00, 0xaa},
393         {0x00, 0x08, 0xcb},
394         {0x01, 0x70, 0x0c}
395 };
396
397 static u8 vt3342_channel_table0[CB_MAX_CHANNEL][3] = {
398         {0x02, 0x05, 0x03},
399         {0x01, 0x15, 0x03},
400         {0x03, 0xc5, 0x03},
401         {0x02, 0x65, 0x03},
402         {0x01, 0x15, 0x13},
403         {0x03, 0xc5, 0x13},
404         {0x02, 0x05, 0x13},
405         {0x01, 0x15, 0x13},
406         {0x03, 0xc5, 0x13},
407         {0x02, 0x65, 0x13},
408         {0x01, 0x15, 0x23},
409         {0x03, 0xc5, 0x23},
410         {0x02, 0x05, 0x23},
411         {0x00, 0xd5, 0x23},
412         {0x01, 0x15, 0x13}, /* channel = 15 Tf = 4915MHz */
413         {0x01, 0x15, 0x13},
414         {0x01, 0x15, 0x13},
415         {0x01, 0x15, 0x13},
416         {0x01, 0x15, 0x13},
417         {0x01, 0x15, 0x13},
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, 0x55, 0x63},
428         {0x01, 0x55, 0x63},
429         {0x02, 0xa5, 0x63},
430         {0x02, 0xa5, 0x63},
431         {0x00, 0x05, 0x73},
432         {0x00, 0x05, 0x73},
433         {0x01, 0x55, 0x73},
434         {0x02, 0xa5, 0x73},
435         {0x00, 0x05, 0x83},
436         {0x01, 0x55, 0x83},
437         {0x02, 0xa5, 0x83},
438         {0x02, 0xa5, 0x83},
439         {0x02, 0xa5, 0x83},
440         {0x02, 0xa5, 0x83},
441         {0x02, 0xa5, 0x83},
442         {0x02, 0xa5, 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         {0x00, 0x05, 0xF3},
450         {0x01, 0x56, 0x03},
451         {0x02, 0xa6, 0x03},
452         {0x00, 0x06, 0x03},
453         {0x00, 0x06, 0x03}
454 };
455
456 static u8 vt3342_channel_table1[CB_MAX_CHANNEL][3] = {
457         {0x01, 0x99, 0x94},
458         {0x02, 0x44, 0x44},
459         {0x02, 0xee, 0xe4},
460         {0x03, 0x99, 0x94},
461         {0x00, 0x44, 0x44},
462         {0x00, 0xee, 0xe4},
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         {0x03, 0x33, 0x34},
471         {0x00, 0x44, 0x44}, /* channel = 15 Tf = 4915MHz */
472         {0x00, 0x44, 0x44},
473         {0x00, 0x44, 0x44},
474         {0x00, 0x44, 0x44},
475         {0x00, 0x44, 0x44},
476         {0x00, 0x44, 0x44},
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         {0x01, 0x55, 0x54},
487         {0x01, 0x55, 0x54},
488         {0x02, 0xaa, 0xa4},
489         {0x02, 0xaa, 0xa4},
490         {0x00, 0x00, 0x04},
491         {0x00, 0x00, 0x04},
492         {0x01, 0x55, 0x54},
493         {0x02, 0xaa, 0xa4},
494         {0x00, 0x00, 0x04},
495         {0x01, 0x55, 0x54},
496         {0x02, 0xaa, 0xa4},
497         {0x02, 0xaa, 0xa4},
498         {0x02, 0xaa, 0xa4},
499         {0x02, 0xaa, 0xa4},
500         {0x02, 0xaa, 0xa4},
501         {0x02, 0xaa, 0xa4},
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         {0x03, 0x00, 0x04},
509         {0x00, 0x55, 0x54},
510         {0x01, 0xaa, 0xa4},
511         {0x03, 0x00, 0x04},
512         {0x03, 0x00, 0x04}
513 };
514
515 enum {
516         VNT_TABLE_INIT = 0,
517         VNT_TABLE_INIT_2 = 0,
518         VNT_TABLE_0 = 1,
519         VNT_TABLE_1 = 2,
520         VNT_TABLE_2 = 1
521 };
522
523 struct vnt_table_info {
524         u8 *addr;
525         int length;
526 };
527
528 static const struct vnt_table_info vnt_table_seq[][3] = {
529         {       /* RF_AL2230, RF_AL2230S init table, channel table 0 and 1 */
530                 {&al2230_init_table[0][0], CB_AL2230_INIT_SEQ * 3},
531                 {&al2230_channel_table0[0][0], CB_MAX_CHANNEL_24G * 3},
532                 {&al2230_channel_table1[0][0], CB_MAX_CHANNEL_24G * 3}
533         }, {    /* RF_AIROHA7230 init table, channel table 0 and 1 */
534                 {&al7230_init_table[0][0], CB_AL7230_INIT_SEQ * 3},
535                 {&al7230_channel_table0[0][0], CB_MAX_CHANNEL * 3},
536                 {&al7230_channel_table1[0][0], CB_MAX_CHANNEL * 3}
537         }, {    /* RF_VT3226 init table, channel table 0 and 1 */
538                 {&vt3226_init_table[0][0], CB_VT3226_INIT_SEQ * 3},
539                 {&vt3226_channel_table0[0][0], CB_MAX_CHANNEL_24G * 3},
540                 {&vt3226_channel_table1[0][0], CB_MAX_CHANNEL_24G * 3}
541         }, {    /* RF_VT3226D0 init table, channel table 0 and 1 */
542                 {&vt3226d0_init_table[0][0], CB_VT3226_INIT_SEQ * 3},
543                 {&vt3226_channel_table0[0][0], CB_MAX_CHANNEL_24G * 3},
544                 {&vt3226_channel_table1[0][0], CB_MAX_CHANNEL_24G * 3}
545         }, {    /* RF_VT3342A0 init table, channel table 0 and 1 */
546                 {&vt3342a0_init_table[0][0], CB_VT3342_INIT_SEQ * 3},
547                 {&vt3342_channel_table0[0][0], CB_MAX_CHANNEL * 3},
548                 {&vt3342_channel_table1[0][0], CB_MAX_CHANNEL * 3}
549         }, {    /* RF_AIROHA7230 init table 2 and channel table 2 */
550                 {&al7230_init_table_amode[0][0], CB_AL7230_INIT_SEQ * 3},
551                 {&al7230_channel_table2[0][0], CB_MAX_CHANNEL * 3},
552                 {NULL, 0}
553         }
554 };
555
556 /*
557  * Description: Write to IF/RF, by embedded programming
558  */
559 int vnt_rf_write_embedded(struct vnt_private *priv, u32 data)
560 {
561         u8 reg_data[4];
562
563         data |= (VNT_RF_REG_LEN << 3) | IFREGCTL_REGW;
564
565         reg_data[0] = (u8)data;
566         reg_data[1] = (u8)(data >> 8);
567         reg_data[2] = (u8)(data >> 16);
568         reg_data[3] = (u8)(data >> 24);
569
570         return vnt_control_out(priv, MESSAGE_TYPE_WRITE_IFRF, 0, 0,
571                                ARRAY_SIZE(reg_data), reg_data);
572 }
573
574 static u8 vnt_rf_addpower(struct vnt_private *priv)
575 {
576         int base;
577         s32 rssi = -priv->current_rssi;
578
579         if (!rssi)
580                 return 7;
581
582         if (priv->rf_type == RF_VT3226D0)
583                 base = -60;
584         else
585                 base = -70;
586
587         if (rssi < base)
588                 return ((rssi - base + 1) / -5) * 2 + 5;
589
590         return 0;
591 }
592
593 /* Set Tx power by power level and rate */
594 static int vnt_rf_set_txpower(struct vnt_private *priv, u8 power,
595                               struct ieee80211_channel *ch)
596 {
597         u32 power_setting = 0;
598         int ret = 0;
599
600         power += vnt_rf_addpower(priv);
601         if (power > VNT_RF_MAX_POWER)
602                 power = VNT_RF_MAX_POWER;
603
604         if (priv->power == power)
605                 return 0;
606
607         priv->power = power;
608
609         switch (priv->rf_type) {
610         case RF_AL2230:
611                 power_setting = 0x0404090 | (power << 12);
612
613                 ret = vnt_rf_write_embedded(priv, power_setting);
614                 if (ret)
615                         return ret;
616
617                 if (ch->flags & IEEE80211_CHAN_NO_OFDM)
618                         ret = vnt_rf_write_embedded(priv, 0x0001b400);
619                 else
620                         ret = vnt_rf_write_embedded(priv, 0x0005a400);
621
622                 break;
623         case RF_AL2230S:
624                 power_setting = 0x0404090 | (power << 12);
625
626                 ret = vnt_rf_write_embedded(priv, power_setting);
627                 if (ret)
628                         return ret;
629
630                 if (ch->flags & IEEE80211_CHAN_NO_OFDM) {
631                         ret = vnt_rf_write_embedded(priv, 0x040c1400);
632                         if (ret)
633                                 return ret;
634
635                         ret = vnt_rf_write_embedded(priv, 0x00299b00);
636                 } else {
637                         ret = vnt_rf_write_embedded(priv, 0x0005a400);
638                         if (ret)
639                                 return ret;
640
641                         ret = vnt_rf_write_embedded(priv, 0x00099b00);
642                 }
643
644                 break;
645
646         case RF_AIROHA7230:
647                 if (ch->flags & IEEE80211_CHAN_NO_OFDM)
648                         ret = vnt_rf_write_embedded(priv, 0x111bb900);
649                 else
650                         ret = vnt_rf_write_embedded(priv, 0x221bb900);
651
652                 if (ret)
653                         return ret;
654
655                 /*
656                  * 0x080F1B00 for 3 wire control TxGain(D10)
657                  * and 0x31 as TX Gain value
658                  */
659                 power_setting = 0x080c0b00 | (power << 12);
660
661                 ret = vnt_rf_write_embedded(priv, power_setting);
662                 break;
663
664         case RF_VT3226:
665                 power_setting = ((0x3f - power) << 20) | (0x17 << 8);
666
667                 ret = vnt_rf_write_embedded(priv, power_setting);
668                 break;
669         case RF_VT3226D0:
670                 if (ch->flags & IEEE80211_CHAN_NO_OFDM) {
671                         u16 hw_value = ch->hw_value;
672
673                         power_setting = ((0x3f - power) << 20) | (0xe07 << 8);
674
675                         ret = vnt_rf_write_embedded(priv, power_setting);
676                         if (ret)
677                                 return ret;
678
679                         ret = vnt_rf_write_embedded(priv, 0x03c6a200);
680                         if (ret)
681                                 return ret;
682
683                         dev_dbg(&priv->usb->dev,
684                                 "%s 11b channel [%d]\n", __func__, hw_value);
685
686                         hw_value--;
687
688                         if (hw_value < ARRAY_SIZE(vt3226d0_lo_current_table)) {
689                                 ret = vnt_rf_write_embedded(priv,
690                                         vt3226d0_lo_current_table[hw_value]);
691                                 if (ret)
692                                         return ret;
693                         }
694
695                         ret = vnt_rf_write_embedded(priv, 0x015C0800);
696                 } else {
697                         dev_dbg(&priv->usb->dev,
698                                 "@@@@ %s> 11G mode\n", __func__);
699
700                         power_setting = ((0x3f - power) << 20) | (0x7 << 8);
701
702                         ret = vnt_rf_write_embedded(priv, power_setting);
703                         if (ret)
704                                 return ret;
705
706                         ret = vnt_rf_write_embedded(priv, 0x00C6A200);
707                         if (ret)
708                                 return ret;
709
710                         ret = vnt_rf_write_embedded(priv, 0x016BC600);
711                         if (ret)
712                                 return ret;
713
714                         ret = vnt_rf_write_embedded(priv, 0x00900800);
715                 }
716
717                 break;
718
719         case RF_VT3342A0:
720                 power_setting =  ((0x3f - power) << 20) | (0x27 << 8);
721
722                 ret = vnt_rf_write_embedded(priv, power_setting);
723                 break;
724         default:
725                 break;
726         }
727         return ret;
728 }
729
730 /* Set Tx power by channel number type */
731 int vnt_rf_setpower(struct vnt_private *priv,
732                     struct ieee80211_channel *ch)
733 {
734         u16 channel;
735         u8 power = priv->cck_pwr;
736
737         if (!ch)
738                 return -EINVAL;
739
740         /* set channel number to array number */
741         channel = ch->hw_value - 1;
742
743         if (ch->flags & IEEE80211_CHAN_NO_OFDM) {
744                 if (channel < ARRAY_SIZE(priv->cck_pwr_tbl))
745                         power = priv->cck_pwr_tbl[channel];
746         } else if (ch->band == NL80211_BAND_5GHZ) {
747                 /* remove 14 channels to array size */
748                 channel -= 14;
749
750                 if (channel < ARRAY_SIZE(priv->ofdm_a_pwr_tbl))
751                         power = priv->ofdm_a_pwr_tbl[channel];
752         } else {
753                 if (channel < ARRAY_SIZE(priv->ofdm_pwr_tbl))
754                         power = priv->ofdm_pwr_tbl[channel];
755         }
756
757         return vnt_rf_set_txpower(priv, power, ch);
758 }
759
760 /* Convert rssi to dbm */
761 void vnt_rf_rssi_to_dbm(struct vnt_private *priv, u8 rssi, long *dbm)
762 {
763         u8 idx = ((rssi & 0xc0) >> 6) & 0x03;
764         long b = rssi & 0x3f;
765         long a = 0;
766         u8 airoharf[4] = {0, 18, 0, 40};
767
768         switch (priv->rf_type) {
769         case RF_AL2230:
770         case RF_AL2230S:
771         case RF_AIROHA7230:
772         case RF_VT3226:
773         case RF_VT3226D0:
774         case RF_VT3342A0:
775                 a = airoharf[idx];
776                 break;
777         default:
778                 break;
779         }
780
781         *dbm = -1 * (a + b * 2);
782 }
783
784 int vnt_rf_table_download(struct vnt_private *priv)
785 {
786         int ret;
787         int idx = -1;
788         const struct vnt_table_info *table_seq;
789
790         switch (priv->rf_type) {
791         case RF_AL2230:
792         case RF_AL2230S:
793                 idx = 0;
794                 break;
795         case RF_AIROHA7230:
796                 idx = 1;
797                 break;
798         case RF_VT3226:
799                 idx = 2;
800                 break;
801         case RF_VT3226D0:
802                 idx = 3;
803                 break;
804         case RF_VT3342A0:
805                 idx = 4;
806                 break;
807         }
808
809         if (idx < 0)
810                 return 0;
811
812         table_seq = &vnt_table_seq[idx][0];
813
814         /* Init Table */
815         ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
816                               MESSAGE_REQUEST_RF_INIT,
817                               table_seq[VNT_TABLE_INIT].length,
818                               table_seq[VNT_TABLE_INIT].addr);
819         if (ret)
820                 return ret;
821
822         /* Channel Table 0 */
823         ret = vnt_control_out_blocks(priv, VNT_REG_BLOCK_SIZE,
824                                      MESSAGE_REQUEST_RF_CH0,
825                                      table_seq[VNT_TABLE_0].length,
826                                      table_seq[VNT_TABLE_0].addr);
827         if (ret)
828                 return ret;
829
830         /* Channel Table 1 */
831         ret = vnt_control_out_blocks(priv, VNT_REG_BLOCK_SIZE,
832                                      MESSAGE_REQUEST_RF_CH1,
833                                      table_seq[VNT_TABLE_1].length,
834                                      table_seq[VNT_TABLE_1].addr);
835
836         if (priv->rf_type == RF_AIROHA7230) {
837                 table_seq = &vnt_table_seq[5][0];
838
839                 /* Init Table 2 */
840                 ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
841                                       MESSAGE_REQUEST_RF_INIT2,
842                                       table_seq[VNT_TABLE_INIT_2].length,
843                                       table_seq[VNT_TABLE_INIT_2].addr);
844                 if (ret)
845                         return ret;
846
847                 /* Channel Table 2 */
848                 ret = vnt_control_out_blocks(priv, VNT_REG_BLOCK_SIZE,
849                                              MESSAGE_REQUEST_RF_CH2,
850                                              table_seq[VNT_TABLE_2].length,
851                                              table_seq[VNT_TABLE_2].addr);
852         }
853
854         return ret;
855 }