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