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