xref: /openbmc/linux/drivers/staging/vt6656/rf.c (revision 9e3bd0f6)
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 }
953