xref: /openbmc/linux/drivers/staging/vt6656/rf.c (revision fca3aa16)
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 void vnt_rf_table_download(struct vnt_private *priv)
815 {
816 	u16 length1 = 0, length2 = 0, length3 = 0;
817 	u8 *addr1 = NULL, *addr2 = NULL, *addr3 = NULL;
818 	u16 length, value;
819 	u8 array[256];
820 
821 	switch (priv->rf_type) {
822 	case RF_AL2230:
823 	case RF_AL2230S:
824 		length1 = CB_AL2230_INIT_SEQ * 3;
825 		length2 = CB_MAX_CHANNEL_24G * 3;
826 		length3 = CB_MAX_CHANNEL_24G * 3;
827 		addr1 = &al2230_init_table[0][0];
828 		addr2 = &al2230_channel_table0[0][0];
829 		addr3 = &al2230_channel_table1[0][0];
830 		break;
831 	case RF_AIROHA7230:
832 		length1 = CB_AL7230_INIT_SEQ * 3;
833 		length2 = CB_MAX_CHANNEL * 3;
834 		length3 = CB_MAX_CHANNEL * 3;
835 		addr1 = &al7230_init_table[0][0];
836 		addr2 = &al7230_channel_table0[0][0];
837 		addr3 = &al7230_channel_table1[0][0];
838 		break;
839 	case RF_VT3226:
840 		length1 = CB_VT3226_INIT_SEQ * 3;
841 		length2 = CB_MAX_CHANNEL_24G * 3;
842 		length3 = CB_MAX_CHANNEL_24G * 3;
843 		addr1 = &vt3226_init_table[0][0];
844 		addr2 = &vt3226_channel_table0[0][0];
845 		addr3 = &vt3226_channel_table1[0][0];
846 		break;
847 	case RF_VT3226D0:
848 		length1 = CB_VT3226_INIT_SEQ * 3;
849 		length2 = CB_MAX_CHANNEL_24G * 3;
850 		length3 = CB_MAX_CHANNEL_24G * 3;
851 		addr1 = &vt3226d0_init_table[0][0];
852 		addr2 = &vt3226_channel_table0[0][0];
853 		addr3 = &vt3226_channel_table1[0][0];
854 		break;
855 	case RF_VT3342A0:
856 		length1 = CB_VT3342_INIT_SEQ * 3;
857 		length2 = CB_MAX_CHANNEL * 3;
858 		length3 = CB_MAX_CHANNEL * 3;
859 		addr1 = &vt3342a0_init_table[0][0];
860 		addr2 = &vt3342_channel_table0[0][0];
861 		addr3 = &vt3342_channel_table1[0][0];
862 		break;
863 	}
864 
865 	/* Init Table */
866 	memcpy(array, addr1, length1);
867 
868 	vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
869 			MESSAGE_REQUEST_RF_INIT, length1, array);
870 
871 	/* Channel Table 0 */
872 	value = 0;
873 	while (length2 > 0) {
874 		if (length2 >= 64)
875 			length = 64;
876 		else
877 			length = length2;
878 
879 		memcpy(array, addr2, length);
880 
881 		vnt_control_out(priv, MESSAGE_TYPE_WRITE,
882 				value, MESSAGE_REQUEST_RF_CH0, length, array);
883 
884 		length2 -= length;
885 		value += length;
886 		addr2 += length;
887 	}
888 
889 	/* Channel table 1 */
890 	value = 0;
891 	while (length3 > 0) {
892 		if (length3 >= 64)
893 			length = 64;
894 		else
895 			length = length3;
896 
897 		memcpy(array, addr3, length);
898 
899 		vnt_control_out(priv, MESSAGE_TYPE_WRITE,
900 				value, MESSAGE_REQUEST_RF_CH1, length, array);
901 
902 		length3 -= length;
903 		value += length;
904 		addr3 += length;
905 	}
906 
907 	if (priv->rf_type == RF_AIROHA7230) {
908 		length1 = CB_AL7230_INIT_SEQ * 3;
909 		length2 = CB_MAX_CHANNEL * 3;
910 		addr1 = &al7230_init_table_amode[0][0];
911 		addr2 = &al7230_channel_table2[0][0];
912 
913 		memcpy(array, addr1, length1);
914 
915 		/* Init Table 2 */
916 		vnt_control_out(priv, MESSAGE_TYPE_WRITE,
917 				0, MESSAGE_REQUEST_RF_INIT2, length1, array);
918 
919 		/* Channel Table 0 */
920 		value = 0;
921 		while (length2 > 0) {
922 			if (length2 >= 64)
923 				length = 64;
924 			else
925 				length = length2;
926 
927 			memcpy(array, addr2, length);
928 
929 			vnt_control_out(priv, MESSAGE_TYPE_WRITE,
930 					value, MESSAGE_REQUEST_RF_CH2,
931 					length, array);
932 
933 			length2 -= length;
934 			value += length;
935 			addr2 += length;
936 		}
937 	}
938 }
939