]> Pileus Git - ~andy/linux/blob - drivers/staging/vt6655/baseband.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec
[~andy/linux] / drivers / staging / vt6655 / baseband.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  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  *
20  * File: baseband.c
21  *
22  * Purpose: Implement functions to access baseband
23  *
24  * Author: Kyle Hsu
25  *
26  * Date: Aug.22, 2002
27  *
28  * Functions:
29  *      BBuGetFrameTime        - Calculate data frame transmitting time
30  *      BBvCaculateParameter   - Caculate PhyLength, PhyService and Phy Signal parameter for baseband Tx
31  *      BBbReadEmbedded         - Embedded read baseband register via MAC
32  *      BBbWriteEmbedded        - Embedded write baseband register via MAC
33  *      BBbIsRegBitsOn         - Test if baseband register bits on
34  *      BBbIsRegBitsOff        - Test if baseband register bits off
35  *      BBbVT3253Init          - VIA VT3253 baseband chip init code
36  *      BBvReadAllRegs         - Read All Baseband Registers
37  *      BBvLoopbackOn          - Turn on BaseBand Loopback mode
38  *      BBvLoopbackOff         - Turn off BaseBand Loopback mode
39  *
40  * Revision History:
41  *      06-10-2003 Bryan YC Fan:  Re-write codes to support VT3253 spec.
42  *      08-07-2003 Bryan YC Fan:  Add MAXIM2827/2825 and RFMD2959 support.
43  *      08-26-2003 Kyle Hsu    :  Modify BBuGetFrameTime() and BBvCalculateParameter().
44  *                                cancel the setting of MAC_REG_SOFTPWRCTL on BBbVT3253Init().
45  *                                Add the comments.
46  *      09-01-2003 Bryan YC Fan:  RF & BB tables updated.
47  *                                Modified BBvLoopbackOn & BBvLoopbackOff().
48  *
49  *
50  */
51
52 #include "tmacro.h"
53 #include "tether.h"
54 #include "mac.h"
55 #include "baseband.h"
56 #include "srom.h"
57 #include "rf.h"
58
59 /*---------------------  Static Definitions -------------------------*/
60 //static int          msglevel                =MSG_LEVEL_DEBUG;
61 static int          msglevel                =MSG_LEVEL_INFO;
62
63 /*---------------------  Static Classes  ----------------------------*/
64
65 /*---------------------  Static Variables  --------------------------*/
66
67 /*---------------------  Static Functions  --------------------------*/
68
69 /*---------------------  Export Variables  --------------------------*/
70
71 /*---------------------  Static Definitions -------------------------*/
72
73 /*---------------------  Static Classes  ----------------------------*/
74
75 /*---------------------  Static Variables  --------------------------*/
76
77
78
79 #define CB_VT3253_INIT_FOR_RFMD 446
80 unsigned char byVT3253InitTab_RFMD[CB_VT3253_INIT_FOR_RFMD][2] = {
81     {0x00, 0x30},
82     {0x01, 0x00},
83     {0x02, 0x00},
84     {0x03, 0x00},
85     {0x04, 0x00},
86     {0x05, 0x00},
87     {0x06, 0x00},
88     {0x07, 0x00},
89     {0x08, 0x70},
90     {0x09, 0x45},
91     {0x0a, 0x2a},
92     {0x0b, 0x76},
93     {0x0c, 0x00},
94     {0x0d, 0x01},
95     {0x0e, 0x80},
96     {0x0f, 0x00},
97     {0x10, 0x00},
98     {0x11, 0x00},
99     {0x12, 0x00},
100     {0x13, 0x00},
101     {0x14, 0x00},
102     {0x15, 0x00},
103     {0x16, 0x00},
104     {0x17, 0x00},
105     {0x18, 0x00},
106     {0x19, 0x00},
107     {0x1a, 0x00},
108     {0x1b, 0x9d},
109     {0x1c, 0x05},
110     {0x1d, 0x00},
111     {0x1e, 0x00},
112     {0x1f, 0x00},
113     {0x20, 0x00},
114     {0x21, 0x00},
115     {0x22, 0x00},
116     {0x23, 0x00},
117     {0x24, 0x00},
118     {0x25, 0x4a},
119     {0x26, 0x00},
120     {0x27, 0x00},
121     {0x28, 0x00},
122     {0x29, 0x00},
123     {0x2a, 0x00},
124     {0x2b, 0x00},
125     {0x2c, 0x00},
126     {0x2d, 0xa8},
127     {0x2e, 0x1a},
128     {0x2f, 0x0c},
129     {0x30, 0x26},
130     {0x31, 0x5b},
131     {0x32, 0x00},
132     {0x33, 0x00},
133     {0x34, 0x00},
134     {0x35, 0x00},
135     {0x36, 0xaa},
136     {0x37, 0xaa},
137     {0x38, 0xff},
138     {0x39, 0xff},
139     {0x3a, 0x00},
140     {0x3b, 0x00},
141     {0x3c, 0x00},
142     {0x3d, 0x0d},
143     {0x3e, 0x51},
144     {0x3f, 0x04},
145     {0x40, 0x00},
146     {0x41, 0x08},
147     {0x42, 0x00},
148     {0x43, 0x08},
149     {0x44, 0x06},
150     {0x45, 0x14},
151     {0x46, 0x05},
152     {0x47, 0x08},
153     {0x48, 0x00},
154     {0x49, 0x00},
155     {0x4a, 0x00},
156     {0x4b, 0x00},
157     {0x4c, 0x09},
158     {0x4d, 0x80},
159     {0x4e, 0x00},
160     {0x4f, 0xc5},
161     {0x50, 0x14},
162     {0x51, 0x19},
163     {0x52, 0x00},
164     {0x53, 0x00},
165     {0x54, 0x00},
166     {0x55, 0x00},
167     {0x56, 0x00},
168     {0x57, 0x00},
169     {0x58, 0x00},
170     {0x59, 0xb0},
171     {0x5a, 0x00},
172     {0x5b, 0x00},
173     {0x5c, 0x00},
174     {0x5d, 0x00},
175     {0x5e, 0x00},
176     {0x5f, 0x00},
177     {0x60, 0x44},
178     {0x61, 0x04},
179     {0x62, 0x00},
180     {0x63, 0x00},
181     {0x64, 0x00},
182     {0x65, 0x00},
183     {0x66, 0x04},
184     {0x67, 0xb7},
185     {0x68, 0x00},
186     {0x69, 0x00},
187     {0x6a, 0x00},
188     {0x6b, 0x00},
189     {0x6c, 0x00},
190     {0x6d, 0x03},
191     {0x6e, 0x01},
192     {0x6f, 0x00},
193     {0x70, 0x00},
194     {0x71, 0x00},
195     {0x72, 0x00},
196     {0x73, 0x00},
197     {0x74, 0x00},
198     {0x75, 0x00},
199     {0x76, 0x00},
200     {0x77, 0x00},
201     {0x78, 0x00},
202     {0x79, 0x00},
203     {0x7a, 0x00},
204     {0x7b, 0x00},
205     {0x7c, 0x00},
206     {0x7d, 0x00},
207     {0x7e, 0x00},
208     {0x7f, 0x00},
209     {0x80, 0x0b},
210     {0x81, 0x00},
211     {0x82, 0x3c},
212     {0x83, 0x00},
213     {0x84, 0x00},
214     {0x85, 0x00},
215     {0x86, 0x00},
216     {0x87, 0x00},
217     {0x88, 0x08},
218     {0x89, 0x00},
219     {0x8a, 0x08},
220     {0x8b, 0xa6},
221     {0x8c, 0x84},
222     {0x8d, 0x47},
223     {0x8e, 0xbb},
224     {0x8f, 0x02},
225     {0x90, 0x21},
226     {0x91, 0x0c},
227     {0x92, 0x04},
228     {0x93, 0x22},
229     {0x94, 0x00},
230     {0x95, 0x00},
231     {0x96, 0x00},
232     {0x97, 0xeb},
233     {0x98, 0x00},
234     {0x99, 0x00},
235     {0x9a, 0x00},
236     {0x9b, 0x00},
237     {0x9c, 0x00},
238     {0x9d, 0x00},
239     {0x9e, 0x00},
240     {0x9f, 0x00},
241     {0xa0, 0x00},
242     {0xa1, 0x00},
243     {0xa2, 0x00},
244     {0xa3, 0x00},
245     {0xa4, 0x00},
246     {0xa5, 0x00},
247     {0xa6, 0x10},
248     {0xa7, 0x04},
249     {0xa8, 0x10},
250     {0xa9, 0x00},
251     {0xaa, 0x8f},
252     {0xab, 0x00},
253     {0xac, 0x00},
254     {0xad, 0x00},
255     {0xae, 0x00},
256     {0xaf, 0x80},
257     {0xb0, 0x38},
258     {0xb1, 0x00},
259     {0xb2, 0x00},
260     {0xb3, 0x00},
261     {0xb4, 0xee},
262     {0xb5, 0xff},
263     {0xb6, 0x10},
264     {0xb7, 0x00},
265     {0xb8, 0x00},
266     {0xb9, 0x00},
267     {0xba, 0x00},
268     {0xbb, 0x03},
269     {0xbc, 0x00},
270     {0xbd, 0x00},
271     {0xbe, 0x00},
272     {0xbf, 0x00},
273     {0xc0, 0x10},
274     {0xc1, 0x10},
275     {0xc2, 0x18},
276     {0xc3, 0x20},
277     {0xc4, 0x10},
278     {0xc5, 0x00},
279     {0xc6, 0x22},
280     {0xc7, 0x14},
281     {0xc8, 0x0f},
282     {0xc9, 0x08},
283     {0xca, 0xa4},
284     {0xcb, 0xa7},
285     {0xcc, 0x3c},
286     {0xcd, 0x10},
287     {0xce, 0x20},
288     {0xcf, 0x00},
289     {0xd0, 0x00},
290     {0xd1, 0x10},
291     {0xd2, 0x00},
292     {0xd3, 0x00},
293     {0xd4, 0x10},
294     {0xd5, 0x33},
295     {0xd6, 0x70},
296     {0xd7, 0x01},
297     {0xd8, 0x00},
298     {0xd9, 0x00},
299     {0xda, 0x00},
300     {0xdb, 0x00},
301     {0xdc, 0x00},
302     {0xdd, 0x00},
303     {0xde, 0x00},
304     {0xdf, 0x00},
305     {0xe0, 0x00},
306     {0xe1, 0x00},
307     {0xe2, 0xcc},
308     {0xe3, 0x04},
309     {0xe4, 0x08},
310     {0xe5, 0x10},
311     {0xe6, 0x00},
312     {0xe7, 0x0e},
313     {0xe8, 0x88},
314     {0xe9, 0xd4},
315     {0xea, 0x05},
316     {0xeb, 0xf0},
317     {0xec, 0x79},
318     {0xed, 0x0f},
319     {0xee, 0x04},
320     {0xef, 0x04},
321     {0xf0, 0x00},
322     {0xf1, 0x00},
323     {0xf2, 0x00},
324     {0xf3, 0x00},
325     {0xf4, 0x00},
326     {0xf5, 0x00},
327     {0xf6, 0x00},
328     {0xf7, 0x00},
329     {0xf8, 0x00},
330     {0xf9, 0x00},
331     {0xF0, 0x00},
332     {0xF1, 0xF8},
333     {0xF0, 0x80},
334     {0xF0, 0x00},
335     {0xF1, 0xF4},
336     {0xF0, 0x81},
337     {0xF0, 0x01},
338     {0xF1, 0xF0},
339     {0xF0, 0x82},
340     {0xF0, 0x02},
341     {0xF1, 0xEC},
342     {0xF0, 0x83},
343     {0xF0, 0x03},
344     {0xF1, 0xE8},
345     {0xF0, 0x84},
346     {0xF0, 0x04},
347     {0xF1, 0xE4},
348     {0xF0, 0x85},
349     {0xF0, 0x05},
350     {0xF1, 0xE0},
351     {0xF0, 0x86},
352     {0xF0, 0x06},
353     {0xF1, 0xDC},
354     {0xF0, 0x87},
355     {0xF0, 0x07},
356     {0xF1, 0xD8},
357     {0xF0, 0x88},
358     {0xF0, 0x08},
359     {0xF1, 0xD4},
360     {0xF0, 0x89},
361     {0xF0, 0x09},
362     {0xF1, 0xD0},
363     {0xF0, 0x8A},
364     {0xF0, 0x0A},
365     {0xF1, 0xCC},
366     {0xF0, 0x8B},
367     {0xF0, 0x0B},
368     {0xF1, 0xC8},
369     {0xF0, 0x8C},
370     {0xF0, 0x0C},
371     {0xF1, 0xC4},
372     {0xF0, 0x8D},
373     {0xF0, 0x0D},
374     {0xF1, 0xC0},
375     {0xF0, 0x8E},
376     {0xF0, 0x0E},
377     {0xF1, 0xBC},
378     {0xF0, 0x8F},
379     {0xF0, 0x0F},
380     {0xF1, 0xB8},
381     {0xF0, 0x90},
382     {0xF0, 0x10},
383     {0xF1, 0xB4},
384     {0xF0, 0x91},
385     {0xF0, 0x11},
386     {0xF1, 0xB0},
387     {0xF0, 0x92},
388     {0xF0, 0x12},
389     {0xF1, 0xAC},
390     {0xF0, 0x93},
391     {0xF0, 0x13},
392     {0xF1, 0xA8},
393     {0xF0, 0x94},
394     {0xF0, 0x14},
395     {0xF1, 0xA4},
396     {0xF0, 0x95},
397     {0xF0, 0x15},
398     {0xF1, 0xA0},
399     {0xF0, 0x96},
400     {0xF0, 0x16},
401     {0xF1, 0x9C},
402     {0xF0, 0x97},
403     {0xF0, 0x17},
404     {0xF1, 0x98},
405     {0xF0, 0x98},
406     {0xF0, 0x18},
407     {0xF1, 0x94},
408     {0xF0, 0x99},
409     {0xF0, 0x19},
410     {0xF1, 0x90},
411     {0xF0, 0x9A},
412     {0xF0, 0x1A},
413     {0xF1, 0x8C},
414     {0xF0, 0x9B},
415     {0xF0, 0x1B},
416     {0xF1, 0x88},
417     {0xF0, 0x9C},
418     {0xF0, 0x1C},
419     {0xF1, 0x84},
420     {0xF0, 0x9D},
421     {0xF0, 0x1D},
422     {0xF1, 0x80},
423     {0xF0, 0x9E},
424     {0xF0, 0x1E},
425     {0xF1, 0x7C},
426     {0xF0, 0x9F},
427     {0xF0, 0x1F},
428     {0xF1, 0x78},
429     {0xF0, 0xA0},
430     {0xF0, 0x20},
431     {0xF1, 0x74},
432     {0xF0, 0xA1},
433     {0xF0, 0x21},
434     {0xF1, 0x70},
435     {0xF0, 0xA2},
436     {0xF0, 0x22},
437     {0xF1, 0x6C},
438     {0xF0, 0xA3},
439     {0xF0, 0x23},
440     {0xF1, 0x68},
441     {0xF0, 0xA4},
442     {0xF0, 0x24},
443     {0xF1, 0x64},
444     {0xF0, 0xA5},
445     {0xF0, 0x25},
446     {0xF1, 0x60},
447     {0xF0, 0xA6},
448     {0xF0, 0x26},
449     {0xF1, 0x5C},
450     {0xF0, 0xA7},
451     {0xF0, 0x27},
452     {0xF1, 0x58},
453     {0xF0, 0xA8},
454     {0xF0, 0x28},
455     {0xF1, 0x54},
456     {0xF0, 0xA9},
457     {0xF0, 0x29},
458     {0xF1, 0x50},
459     {0xF0, 0xAA},
460     {0xF0, 0x2A},
461     {0xF1, 0x4C},
462     {0xF0, 0xAB},
463     {0xF0, 0x2B},
464     {0xF1, 0x48},
465     {0xF0, 0xAC},
466     {0xF0, 0x2C},
467     {0xF1, 0x44},
468     {0xF0, 0xAD},
469     {0xF0, 0x2D},
470     {0xF1, 0x40},
471     {0xF0, 0xAE},
472     {0xF0, 0x2E},
473     {0xF1, 0x3C},
474     {0xF0, 0xAF},
475     {0xF0, 0x2F},
476     {0xF1, 0x38},
477     {0xF0, 0xB0},
478     {0xF0, 0x30},
479     {0xF1, 0x34},
480     {0xF0, 0xB1},
481     {0xF0, 0x31},
482     {0xF1, 0x30},
483     {0xF0, 0xB2},
484     {0xF0, 0x32},
485     {0xF1, 0x2C},
486     {0xF0, 0xB3},
487     {0xF0, 0x33},
488     {0xF1, 0x28},
489     {0xF0, 0xB4},
490     {0xF0, 0x34},
491     {0xF1, 0x24},
492     {0xF0, 0xB5},
493     {0xF0, 0x35},
494     {0xF1, 0x20},
495     {0xF0, 0xB6},
496     {0xF0, 0x36},
497     {0xF1, 0x1C},
498     {0xF0, 0xB7},
499     {0xF0, 0x37},
500     {0xF1, 0x18},
501     {0xF0, 0xB8},
502     {0xF0, 0x38},
503     {0xF1, 0x14},
504     {0xF0, 0xB9},
505     {0xF0, 0x39},
506     {0xF1, 0x10},
507     {0xF0, 0xBA},
508     {0xF0, 0x3A},
509     {0xF1, 0x0C},
510     {0xF0, 0xBB},
511     {0xF0, 0x3B},
512     {0xF1, 0x08},
513     {0xF0, 0x00},
514     {0xF0, 0x3C},
515     {0xF1, 0x04},
516     {0xF0, 0xBD},
517     {0xF0, 0x3D},
518     {0xF1, 0x00},
519     {0xF0, 0xBE},
520     {0xF0, 0x3E},
521     {0xF1, 0x00},
522     {0xF0, 0xBF},
523     {0xF0, 0x3F},
524     {0xF1, 0x00},
525     {0xF0, 0xC0},
526     {0xF0, 0x00},
527 };
528
529 #define CB_VT3253B0_INIT_FOR_RFMD 256
530 unsigned char byVT3253B0_RFMD[CB_VT3253B0_INIT_FOR_RFMD][2] = {
531     {0x00, 0x31},
532     {0x01, 0x00},
533     {0x02, 0x00},
534     {0x03, 0x00},
535     {0x04, 0x00},
536     {0x05, 0x81},
537     {0x06, 0x00},
538     {0x07, 0x00},
539     {0x08, 0x38},
540     {0x09, 0x45},
541     {0x0a, 0x2a},
542     {0x0b, 0x76},
543     {0x0c, 0x00},
544     {0x0d, 0x00},
545     {0x0e, 0x80},
546     {0x0f, 0x00},
547     {0x10, 0x00},
548     {0x11, 0x00},
549     {0x12, 0x00},
550     {0x13, 0x00},
551     {0x14, 0x00},
552     {0x15, 0x00},
553     {0x16, 0x00},
554     {0x17, 0x00},
555     {0x18, 0x00},
556     {0x19, 0x00},
557     {0x1a, 0x00},
558     {0x1b, 0x8e},
559     {0x1c, 0x06},
560     {0x1d, 0x00},
561     {0x1e, 0x00},
562     {0x1f, 0x00},
563     {0x20, 0x00},
564     {0x21, 0x00},
565     {0x22, 0x00},
566     {0x23, 0x00},
567     {0x24, 0x00},
568     {0x25, 0x4a},
569     {0x26, 0x00},
570     {0x27, 0x00},
571     {0x28, 0x00},
572     {0x29, 0x00},
573     {0x2a, 0x00},
574     {0x2b, 0x00},
575     {0x2c, 0x00},
576     {0x2d, 0x34},
577     {0x2e, 0x18},
578     {0x2f, 0x0c},
579     {0x30, 0x26},
580     {0x31, 0x5b},
581     {0x32, 0x00},
582     {0x33, 0x00},
583     {0x34, 0x00},
584     {0x35, 0x00},
585     {0x36, 0xaa},
586     {0x37, 0xaa},
587     {0x38, 0xff},
588     {0x39, 0xff},
589     {0x3a, 0xf8},
590     {0x3b, 0x00},
591     {0x3c, 0x00},
592     {0x3d, 0x09},
593     {0x3e, 0x0d},
594     {0x3f, 0x04},
595     {0x40, 0x00},
596     {0x41, 0x08},
597     {0x42, 0x00},
598     {0x43, 0x08},
599     {0x44, 0x08},
600     {0x45, 0x14},
601     {0x46, 0x05},
602     {0x47, 0x08},
603     {0x48, 0x00},
604     {0x49, 0x00},
605     {0x4a, 0x00},
606     {0x4b, 0x00},
607     {0x4c, 0x09},
608     {0x4d, 0x80},
609     {0x4e, 0x00},
610     {0x4f, 0xc5},
611     {0x50, 0x14},
612     {0x51, 0x19},
613     {0x52, 0x00},
614     {0x53, 0x00},
615     {0x54, 0x00},
616     {0x55, 0x00},
617     {0x56, 0x00},
618     {0x57, 0x00},
619     {0x58, 0x00},
620     {0x59, 0xb0},
621     {0x5a, 0x00},
622     {0x5b, 0x00},
623     {0x5c, 0x00},
624     {0x5d, 0x00},
625     {0x5e, 0x00},
626     {0x5f, 0x00},
627     {0x60, 0x39},
628     {0x61, 0x83},
629     {0x62, 0x00},
630     {0x63, 0x00},
631     {0x64, 0x00},
632     {0x65, 0x00},
633     {0x66, 0xc0},
634     {0x67, 0x49},
635     {0x68, 0x00},
636     {0x69, 0x00},
637     {0x6a, 0x00},
638     {0x6b, 0x00},
639     {0x6c, 0x00},
640     {0x6d, 0x03},
641     {0x6e, 0x01},
642     {0x6f, 0x00},
643     {0x70, 0x00},
644     {0x71, 0x00},
645     {0x72, 0x00},
646     {0x73, 0x00},
647     {0x74, 0x00},
648     {0x75, 0x00},
649     {0x76, 0x00},
650     {0x77, 0x00},
651     {0x78, 0x00},
652     {0x79, 0x00},
653     {0x7a, 0x00},
654     {0x7b, 0x00},
655     {0x7c, 0x00},
656     {0x7d, 0x00},
657     {0x7e, 0x00},
658     {0x7f, 0x00},
659     {0x80, 0x89},
660     {0x81, 0x00},
661     {0x82, 0x0e},
662     {0x83, 0x00},
663     {0x84, 0x00},
664     {0x85, 0x00},
665     {0x86, 0x00},
666     {0x87, 0x00},
667     {0x88, 0x08},
668     {0x89, 0x00},
669     {0x8a, 0x0e},
670     {0x8b, 0xa7},
671     {0x8c, 0x88},
672     {0x8d, 0x47},
673     {0x8e, 0xaa},
674     {0x8f, 0x02},
675     {0x90, 0x23},
676     {0x91, 0x0c},
677     {0x92, 0x06},
678     {0x93, 0x08},
679     {0x94, 0x00},
680     {0x95, 0x00},
681     {0x96, 0x00},
682     {0x97, 0xeb},
683     {0x98, 0x00},
684     {0x99, 0x00},
685     {0x9a, 0x00},
686     {0x9b, 0x00},
687     {0x9c, 0x00},
688     {0x9d, 0x00},
689     {0x9e, 0x00},
690     {0x9f, 0x00},
691     {0xa0, 0x00},
692     {0xa1, 0x00},
693     {0xa2, 0x00},
694     {0xa3, 0xcd},
695     {0xa4, 0x07},
696     {0xa5, 0x33},
697     {0xa6, 0x18},
698     {0xa7, 0x00},
699     {0xa8, 0x18},
700     {0xa9, 0x00},
701     {0xaa, 0x28},
702     {0xab, 0x00},
703     {0xac, 0x00},
704     {0xad, 0x00},
705     {0xae, 0x00},
706     {0xaf, 0x18},
707     {0xb0, 0x38},
708     {0xb1, 0x30},
709     {0xb2, 0x00},
710     {0xb3, 0x00},
711     {0xb4, 0x00},
712     {0xb5, 0x00},
713     {0xb6, 0x84},
714     {0xb7, 0xfd},
715     {0xb8, 0x00},
716     {0xb9, 0x00},
717     {0xba, 0x00},
718     {0xbb, 0x03},
719     {0xbc, 0x00},
720     {0xbd, 0x00},
721     {0xbe, 0x00},
722     {0xbf, 0x00},
723     {0xc0, 0x10},
724     {0xc1, 0x20},
725     {0xc2, 0x18},
726     {0xc3, 0x20},
727     {0xc4, 0x10},
728     {0xc5, 0x2c},
729     {0xc6, 0x1e},
730     {0xc7, 0x10},
731     {0xc8, 0x12},
732     {0xc9, 0x01},
733     {0xca, 0x6f},
734     {0xcb, 0xa7},
735     {0xcc, 0x3c},
736     {0xcd, 0x10},
737     {0xce, 0x00},
738     {0xcf, 0x22},
739     {0xd0, 0x00},
740     {0xd1, 0x10},
741     {0xd2, 0x00},
742     {0xd3, 0x00},
743     {0xd4, 0x10},
744     {0xd5, 0x33},
745     {0xd6, 0x80},
746     {0xd7, 0x21},
747     {0xd8, 0x00},
748     {0xd9, 0x00},
749     {0xda, 0x00},
750     {0xdb, 0x00},
751     {0xdc, 0x00},
752     {0xdd, 0x00},
753     {0xde, 0x00},
754     {0xdf, 0x00},
755     {0xe0, 0x00},
756     {0xe1, 0xB3},
757     {0xe2, 0x00},
758     {0xe3, 0x00},
759     {0xe4, 0x00},
760     {0xe5, 0x10},
761     {0xe6, 0x00},
762     {0xe7, 0x18},
763     {0xe8, 0x08},
764     {0xe9, 0xd4},
765     {0xea, 0x00},
766     {0xeb, 0xff},
767     {0xec, 0x79},
768     {0xed, 0x10},
769     {0xee, 0x30},
770     {0xef, 0x02},
771     {0xf0, 0x00},
772     {0xf1, 0x09},
773     {0xf2, 0x00},
774     {0xf3, 0x00},
775     {0xf4, 0x00},
776     {0xf5, 0x00},
777     {0xf6, 0x00},
778     {0xf7, 0x00},
779     {0xf8, 0x00},
780     {0xf9, 0x00},
781     {0xfa, 0x00},
782     {0xfb, 0x00},
783     {0xfc, 0x00},
784     {0xfd, 0x00},
785     {0xfe, 0x00},
786     {0xff, 0x00},
787 };
788
789 #define CB_VT3253B0_AGC_FOR_RFMD2959 195
790 // For RFMD2959
791 unsigned char byVT3253B0_AGC4_RFMD2959[CB_VT3253B0_AGC_FOR_RFMD2959][2] = {
792     {0xF0, 0x00},
793     {0xF1, 0x3E},
794     {0xF0, 0x80},
795     {0xF0, 0x00},
796     {0xF1, 0x3E},
797     {0xF0, 0x81},
798     {0xF0, 0x01},
799     {0xF1, 0x3E},
800     {0xF0, 0x82},
801     {0xF0, 0x02},
802     {0xF1, 0x3E},
803     {0xF0, 0x83},
804     {0xF0, 0x03},
805     {0xF1, 0x3B},
806     {0xF0, 0x84},
807     {0xF0, 0x04},
808     {0xF1, 0x39},
809     {0xF0, 0x85},
810     {0xF0, 0x05},
811     {0xF1, 0x38},
812     {0xF0, 0x86},
813     {0xF0, 0x06},
814     {0xF1, 0x37},
815     {0xF0, 0x87},
816     {0xF0, 0x07},
817     {0xF1, 0x36},
818     {0xF0, 0x88},
819     {0xF0, 0x08},
820     {0xF1, 0x35},
821     {0xF0, 0x89},
822     {0xF0, 0x09},
823     {0xF1, 0x35},
824     {0xF0, 0x8A},
825     {0xF0, 0x0A},
826     {0xF1, 0x34},
827     {0xF0, 0x8B},
828     {0xF0, 0x0B},
829     {0xF1, 0x34},
830     {0xF0, 0x8C},
831     {0xF0, 0x0C},
832     {0xF1, 0x33},
833     {0xF0, 0x8D},
834     {0xF0, 0x0D},
835     {0xF1, 0x32},
836     {0xF0, 0x8E},
837     {0xF0, 0x0E},
838     {0xF1, 0x31},
839     {0xF0, 0x8F},
840     {0xF0, 0x0F},
841     {0xF1, 0x30},
842     {0xF0, 0x90},
843     {0xF0, 0x10},
844     {0xF1, 0x2F},
845     {0xF0, 0x91},
846     {0xF0, 0x11},
847     {0xF1, 0x2F},
848     {0xF0, 0x92},
849     {0xF0, 0x12},
850     {0xF1, 0x2E},
851     {0xF0, 0x93},
852     {0xF0, 0x13},
853     {0xF1, 0x2D},
854     {0xF0, 0x94},
855     {0xF0, 0x14},
856     {0xF1, 0x2C},
857     {0xF0, 0x95},
858     {0xF0, 0x15},
859     {0xF1, 0x2B},
860     {0xF0, 0x96},
861     {0xF0, 0x16},
862     {0xF1, 0x2B},
863     {0xF0, 0x97},
864     {0xF0, 0x17},
865     {0xF1, 0x2A},
866     {0xF0, 0x98},
867     {0xF0, 0x18},
868     {0xF1, 0x29},
869     {0xF0, 0x99},
870     {0xF0, 0x19},
871     {0xF1, 0x28},
872     {0xF0, 0x9A},
873     {0xF0, 0x1A},
874     {0xF1, 0x27},
875     {0xF0, 0x9B},
876     {0xF0, 0x1B},
877     {0xF1, 0x26},
878     {0xF0, 0x9C},
879     {0xF0, 0x1C},
880     {0xF1, 0x25},
881     {0xF0, 0x9D},
882     {0xF0, 0x1D},
883     {0xF1, 0x24},
884     {0xF0, 0x9E},
885     {0xF0, 0x1E},
886     {0xF1, 0x24},
887     {0xF0, 0x9F},
888     {0xF0, 0x1F},
889     {0xF1, 0x23},
890     {0xF0, 0xA0},
891     {0xF0, 0x20},
892     {0xF1, 0x22},
893     {0xF0, 0xA1},
894     {0xF0, 0x21},
895     {0xF1, 0x21},
896     {0xF0, 0xA2},
897     {0xF0, 0x22},
898     {0xF1, 0x20},
899     {0xF0, 0xA3},
900     {0xF0, 0x23},
901     {0xF1, 0x20},
902     {0xF0, 0xA4},
903     {0xF0, 0x24},
904     {0xF1, 0x1F},
905     {0xF0, 0xA5},
906     {0xF0, 0x25},
907     {0xF1, 0x1E},
908     {0xF0, 0xA6},
909     {0xF0, 0x26},
910     {0xF1, 0x1D},
911     {0xF0, 0xA7},
912     {0xF0, 0x27},
913     {0xF1, 0x1C},
914     {0xF0, 0xA8},
915     {0xF0, 0x28},
916     {0xF1, 0x1B},
917     {0xF0, 0xA9},
918     {0xF0, 0x29},
919     {0xF1, 0x1B},
920     {0xF0, 0xAA},
921     {0xF0, 0x2A},
922     {0xF1, 0x1A},
923     {0xF0, 0xAB},
924     {0xF0, 0x2B},
925     {0xF1, 0x1A},
926     {0xF0, 0xAC},
927     {0xF0, 0x2C},
928     {0xF1, 0x19},
929     {0xF0, 0xAD},
930     {0xF0, 0x2D},
931     {0xF1, 0x18},
932     {0xF0, 0xAE},
933     {0xF0, 0x2E},
934     {0xF1, 0x17},
935     {0xF0, 0xAF},
936     {0xF0, 0x2F},
937     {0xF1, 0x16},
938     {0xF0, 0xB0},
939     {0xF0, 0x30},
940     {0xF1, 0x15},
941     {0xF0, 0xB1},
942     {0xF0, 0x31},
943     {0xF1, 0x15},
944     {0xF0, 0xB2},
945     {0xF0, 0x32},
946     {0xF1, 0x15},
947     {0xF0, 0xB3},
948     {0xF0, 0x33},
949     {0xF1, 0x14},
950     {0xF0, 0xB4},
951     {0xF0, 0x34},
952     {0xF1, 0x13},
953     {0xF0, 0xB5},
954     {0xF0, 0x35},
955     {0xF1, 0x12},
956     {0xF0, 0xB6},
957     {0xF0, 0x36},
958     {0xF1, 0x11},
959     {0xF0, 0xB7},
960     {0xF0, 0x37},
961     {0xF1, 0x10},
962     {0xF0, 0xB8},
963     {0xF0, 0x38},
964     {0xF1, 0x0F},
965     {0xF0, 0xB9},
966     {0xF0, 0x39},
967     {0xF1, 0x0E},
968     {0xF0, 0xBA},
969     {0xF0, 0x3A},
970     {0xF1, 0x0D},
971     {0xF0, 0xBB},
972     {0xF0, 0x3B},
973     {0xF1, 0x0C},
974     {0xF0, 0xBC},
975     {0xF0, 0x3C},
976     {0xF1, 0x0B},
977     {0xF0, 0xBD},
978     {0xF0, 0x3D},
979     {0xF1, 0x0B},
980     {0xF0, 0xBE},
981     {0xF0, 0x3E},
982     {0xF1, 0x0A},
983     {0xF0, 0xBF},
984     {0xF0, 0x3F},
985     {0xF1, 0x09},
986     {0xF0, 0x00},
987 };
988
989 #define CB_VT3253B0_INIT_FOR_AIROHA2230 256
990 // For AIROHA
991 unsigned char byVT3253B0_AIROHA2230[CB_VT3253B0_INIT_FOR_AIROHA2230][2] = {
992     {0x00, 0x31},
993     {0x01, 0x00},
994     {0x02, 0x00},
995     {0x03, 0x00},
996     {0x04, 0x00},
997     {0x05, 0x80},
998     {0x06, 0x00},
999     {0x07, 0x00},
1000     {0x08, 0x70},
1001     {0x09, 0x41},
1002     {0x0a, 0x2A},
1003     {0x0b, 0x76},
1004     {0x0c, 0x00},
1005     {0x0d, 0x00},
1006     {0x0e, 0x80},
1007     {0x0f, 0x00},
1008     {0x10, 0x00},
1009     {0x11, 0x00},
1010     {0x12, 0x00},
1011     {0x13, 0x00},
1012     {0x14, 0x00},
1013     {0x15, 0x00},
1014     {0x16, 0x00},
1015     {0x17, 0x00},
1016     {0x18, 0x00},
1017     {0x19, 0x00},
1018     {0x1a, 0x00},
1019     {0x1b, 0x8f},
1020     {0x1c, 0x09},
1021     {0x1d, 0x00},
1022     {0x1e, 0x00},
1023     {0x1f, 0x00},
1024     {0x20, 0x00},
1025     {0x21, 0x00},
1026     {0x22, 0x00},
1027     {0x23, 0x00},
1028     {0x24, 0x00},
1029     {0x25, 0x4a},
1030     {0x26, 0x00},
1031     {0x27, 0x00},
1032     {0x28, 0x00},
1033     {0x29, 0x00},
1034     {0x2a, 0x00},
1035     {0x2b, 0x00},
1036     {0x2c, 0x00},
1037     {0x2d, 0x4a},
1038     {0x2e, 0x00},
1039     {0x2f, 0x0a},
1040     {0x30, 0x26},
1041     {0x31, 0x5b},
1042     {0x32, 0x00},
1043     {0x33, 0x00},
1044     {0x34, 0x00},
1045     {0x35, 0x00},
1046     {0x36, 0xaa},
1047     {0x37, 0xaa},
1048     {0x38, 0xff},
1049     {0x39, 0xff},
1050     {0x3a, 0x79},
1051     {0x3b, 0x00},
1052     {0x3c, 0x00},
1053     {0x3d, 0x0b},
1054     {0x3e, 0x48},
1055     {0x3f, 0x04},
1056     {0x40, 0x00},
1057     {0x41, 0x08},
1058     {0x42, 0x00},
1059     {0x43, 0x08},
1060     {0x44, 0x08},
1061     {0x45, 0x14},
1062     {0x46, 0x05},
1063     {0x47, 0x09},
1064     {0x48, 0x00},
1065     {0x49, 0x00},
1066     {0x4a, 0x00},
1067     {0x4b, 0x00},
1068     {0x4c, 0x09},
1069     {0x4d, 0x73},
1070     {0x4e, 0x00},
1071     {0x4f, 0xc5},
1072     {0x50, 0x15},
1073     {0x51, 0x19},
1074     {0x52, 0x00},
1075     {0x53, 0x00},
1076     {0x54, 0x00},
1077     {0x55, 0x00},
1078     {0x56, 0x00},
1079     {0x57, 0x00},
1080     {0x58, 0x00},
1081     {0x59, 0xb0},
1082     {0x5a, 0x00},
1083     {0x5b, 0x00},
1084     {0x5c, 0x00},
1085     {0x5d, 0x00},
1086     {0x5e, 0x00},
1087     {0x5f, 0x00},
1088     {0x60, 0xe4},
1089     {0x61, 0x80},
1090     {0x62, 0x00},
1091     {0x63, 0x00},
1092     {0x64, 0x00},
1093     {0x65, 0x00},
1094     {0x66, 0x98},
1095     {0x67, 0x0a},
1096     {0x68, 0x00},
1097     {0x69, 0x00},
1098     {0x6a, 0x00},
1099     {0x6b, 0x00},
1100     //{0x6c, 0x80},
1101     {0x6c, 0x00}, //RobertYu:20050125, request by JJSue
1102     {0x6d, 0x03},
1103     {0x6e, 0x01},
1104     {0x6f, 0x00},
1105     {0x70, 0x00},
1106     {0x71, 0x00},
1107     {0x72, 0x00},
1108     {0x73, 0x00},
1109     {0x74, 0x00},
1110     {0x75, 0x00},
1111     {0x76, 0x00},
1112     {0x77, 0x00},
1113     {0x78, 0x00},
1114     {0x79, 0x00},
1115     {0x7a, 0x00},
1116     {0x7b, 0x00},
1117     {0x7c, 0x00},
1118     {0x7d, 0x00},
1119     {0x7e, 0x00},
1120     {0x7f, 0x00},
1121     {0x80, 0x8c},
1122     {0x81, 0x01},
1123     {0x82, 0x09},
1124     {0x83, 0x00},
1125     {0x84, 0x00},
1126     {0x85, 0x00},
1127     {0x86, 0x00},
1128     {0x87, 0x00},
1129     {0x88, 0x08},
1130     {0x89, 0x00},
1131     {0x8a, 0x0f},
1132     {0x8b, 0xb7},
1133     {0x8c, 0x88},
1134     {0x8d, 0x47},
1135     {0x8e, 0xaa},
1136     {0x8f, 0x02},
1137     {0x90, 0x22},
1138     {0x91, 0x00},
1139     {0x92, 0x00},
1140     {0x93, 0x00},
1141     {0x94, 0x00},
1142     {0x95, 0x00},
1143     {0x96, 0x00},
1144     {0x97, 0xeb},
1145     {0x98, 0x00},
1146     {0x99, 0x00},
1147     {0x9a, 0x00},
1148     {0x9b, 0x00},
1149     {0x9c, 0x00},
1150     {0x9d, 0x00},
1151     {0x9e, 0x00},
1152     {0x9f, 0x01},
1153     {0xa0, 0x00},
1154     {0xa1, 0x00},
1155     {0xa2, 0x00},
1156     {0xa3, 0x00},
1157     {0xa4, 0x00},
1158     {0xa5, 0x00},
1159     {0xa6, 0x10},
1160     {0xa7, 0x00},
1161     {0xa8, 0x18},
1162     {0xa9, 0x00},
1163     {0xaa, 0x00},
1164     {0xab, 0x00},
1165     {0xac, 0x00},
1166     {0xad, 0x00},
1167     {0xae, 0x00},
1168     {0xaf, 0x18},
1169     {0xb0, 0x38},
1170     {0xb1, 0x30},
1171     {0xb2, 0x00},
1172     {0xb3, 0x00},
1173     {0xb4, 0xff},
1174     {0xb5, 0x0f},
1175     {0xb6, 0xe4},
1176     {0xb7, 0xe2},
1177     {0xb8, 0x00},
1178     {0xb9, 0x00},
1179     {0xba, 0x00},
1180     {0xbb, 0x03},
1181     {0xbc, 0x01},
1182     {0xbd, 0x00},
1183     {0xbe, 0x00},
1184     {0xbf, 0x00},
1185     {0xc0, 0x18},
1186     {0xc1, 0x20},
1187     {0xc2, 0x07},
1188     {0xc3, 0x18},
1189     {0xc4, 0xff},
1190     {0xc5, 0x2c},
1191     {0xc6, 0x0c},
1192     {0xc7, 0x0a},
1193     {0xc8, 0x0e},
1194     {0xc9, 0x01},
1195     {0xca, 0x68},
1196     {0xcb, 0xa7},
1197     {0xcc, 0x3c},
1198     {0xcd, 0x10},
1199     {0xce, 0x00},
1200     {0xcf, 0x25},
1201     {0xd0, 0x40},
1202     {0xd1, 0x12},
1203     {0xd2, 0x00},
1204     {0xd3, 0x00},
1205     {0xd4, 0x10},
1206     {0xd5, 0x28},
1207     {0xd6, 0x80},
1208     {0xd7, 0x2A},
1209     {0xd8, 0x00},
1210     {0xd9, 0x00},
1211     {0xda, 0x00},
1212     {0xdb, 0x00},
1213     {0xdc, 0x00},
1214     {0xdd, 0x00},
1215     {0xde, 0x00},
1216     {0xdf, 0x00},
1217     {0xe0, 0x00},
1218     {0xe1, 0xB3},
1219     {0xe2, 0x00},
1220     {0xe3, 0x00},
1221     {0xe4, 0x00},
1222     {0xe5, 0x10},
1223     {0xe6, 0x00},
1224     {0xe7, 0x1C},
1225     {0xe8, 0x00},
1226     {0xe9, 0xf4},
1227     {0xea, 0x00},
1228     {0xeb, 0xff},
1229     {0xec, 0x79},
1230     {0xed, 0x20},
1231     {0xee, 0x30},
1232     {0xef, 0x01},
1233     {0xf0, 0x00},
1234     {0xf1, 0x3e},
1235     {0xf2, 0x00},
1236     {0xf3, 0x00},
1237     {0xf4, 0x00},
1238     {0xf5, 0x00},
1239     {0xf6, 0x00},
1240     {0xf7, 0x00},
1241     {0xf8, 0x00},
1242     {0xf9, 0x00},
1243     {0xfa, 0x00},
1244     {0xfb, 0x00},
1245     {0xfc, 0x00},
1246     {0xfd, 0x00},
1247     {0xfe, 0x00},
1248     {0xff, 0x00},
1249 };
1250
1251
1252
1253 #define CB_VT3253B0_INIT_FOR_UW2451 256
1254 //For UW2451
1255 unsigned char byVT3253B0_UW2451[CB_VT3253B0_INIT_FOR_UW2451][2] = {
1256     {0x00, 0x31},
1257     {0x01, 0x00},
1258     {0x02, 0x00},
1259     {0x03, 0x00},
1260     {0x04, 0x00},
1261     {0x05, 0x81},
1262     {0x06, 0x00},
1263     {0x07, 0x00},
1264     {0x08, 0x38},
1265     {0x09, 0x45},
1266     {0x0a, 0x28},
1267     {0x0b, 0x76},
1268     {0x0c, 0x00},
1269     {0x0d, 0x00},
1270     {0x0e, 0x80},
1271     {0x0f, 0x00},
1272     {0x10, 0x00},
1273     {0x11, 0x00},
1274     {0x12, 0x00},
1275     {0x13, 0x00},
1276     {0x14, 0x00},
1277     {0x15, 0x00},
1278     {0x16, 0x00},
1279     {0x17, 0x00},
1280     {0x18, 0x00},
1281     {0x19, 0x00},
1282     {0x1a, 0x00},
1283     {0x1b, 0x8f},
1284     {0x1c, 0x0f},
1285     {0x1d, 0x00},
1286     {0x1e, 0x00},
1287     {0x1f, 0x00},
1288     {0x20, 0x00},
1289     {0x21, 0x00},
1290     {0x22, 0x00},
1291     {0x23, 0x00},
1292     {0x24, 0x00},
1293     {0x25, 0x4a},
1294     {0x26, 0x00},
1295     {0x27, 0x00},
1296     {0x28, 0x00},
1297     {0x29, 0x00},
1298     {0x2a, 0x00},
1299     {0x2b, 0x00},
1300     {0x2c, 0x00},
1301     {0x2d, 0x18},
1302     {0x2e, 0x00},
1303     {0x2f, 0x0a},
1304     {0x30, 0x26},
1305     {0x31, 0x5b},
1306     {0x32, 0x00},
1307     {0x33, 0x00},
1308     {0x34, 0x00},
1309     {0x35, 0x00},
1310     {0x36, 0xaa},
1311     {0x37, 0xaa},
1312     {0x38, 0xff},
1313     {0x39, 0xff},
1314     {0x3a, 0x00},
1315     {0x3b, 0x00},
1316     {0x3c, 0x00},
1317     {0x3d, 0x03},
1318     {0x3e, 0x1d},
1319     {0x3f, 0x04},
1320     {0x40, 0x00},
1321     {0x41, 0x08},
1322     {0x42, 0x00},
1323     {0x43, 0x08},
1324     {0x44, 0x08},
1325     {0x45, 0x14},
1326     {0x46, 0x05},
1327     {0x47, 0x09},
1328     {0x48, 0x00},
1329     {0x49, 0x00},
1330     {0x4a, 0x00},
1331     {0x4b, 0x00},
1332     {0x4c, 0x09},
1333     {0x4d, 0x90},
1334     {0x4e, 0x00},
1335     {0x4f, 0xc5},
1336     {0x50, 0x15},
1337     {0x51, 0x19},
1338     {0x52, 0x00},
1339     {0x53, 0x00},
1340     {0x54, 0x00},
1341     {0x55, 0x00},
1342     {0x56, 0x00},
1343     {0x57, 0x00},
1344     {0x58, 0x00},
1345     {0x59, 0xb0},
1346     {0x5a, 0x00},
1347     {0x5b, 0x00},
1348     {0x5c, 0x00},
1349     {0x5d, 0x00},
1350     {0x5e, 0x00},
1351     {0x5f, 0x00},
1352     {0x60, 0xb3},
1353     {0x61, 0x81},
1354     {0x62, 0x00},
1355     {0x63, 0x00},
1356     {0x64, 0x00},
1357     {0x65, 0x00},
1358     {0x66, 0x57},
1359     {0x67, 0x6c},
1360     {0x68, 0x00},
1361     {0x69, 0x00},
1362     {0x6a, 0x00},
1363     {0x6b, 0x00},
1364     //{0x6c, 0x80},
1365     {0x6c, 0x00}, //RobertYu:20050125, request by JJSue
1366     {0x6d, 0x03},
1367     {0x6e, 0x01},
1368     {0x6f, 0x00},
1369     {0x70, 0x00},
1370     {0x71, 0x00},
1371     {0x72, 0x00},
1372     {0x73, 0x00},
1373     {0x74, 0x00},
1374     {0x75, 0x00},
1375     {0x76, 0x00},
1376     {0x77, 0x00},
1377     {0x78, 0x00},
1378     {0x79, 0x00},
1379     {0x7a, 0x00},
1380     {0x7b, 0x00},
1381     {0x7c, 0x00},
1382     {0x7d, 0x00},
1383     {0x7e, 0x00},
1384     {0x7f, 0x00},
1385     {0x80, 0x8c},
1386     {0x81, 0x00},
1387     {0x82, 0x0e},
1388     {0x83, 0x00},
1389     {0x84, 0x00},
1390     {0x85, 0x00},
1391     {0x86, 0x00},
1392     {0x87, 0x00},
1393     {0x88, 0x08},
1394     {0x89, 0x00},
1395     {0x8a, 0x0e},
1396     {0x8b, 0xa7},
1397     {0x8c, 0x88},
1398     {0x8d, 0x47},
1399     {0x8e, 0xaa},
1400     {0x8f, 0x02},
1401     {0x90, 0x00},
1402     {0x91, 0x00},
1403     {0x92, 0x00},
1404     {0x93, 0x00},
1405     {0x94, 0x00},
1406     {0x95, 0x00},
1407     {0x96, 0x00},
1408     {0x97, 0xe3},
1409     {0x98, 0x00},
1410     {0x99, 0x00},
1411     {0x9a, 0x00},
1412     {0x9b, 0x00},
1413     {0x9c, 0x00},
1414     {0x9d, 0x00},
1415     {0x9e, 0x00},
1416     {0x9f, 0x00},
1417     {0xa0, 0x00},
1418     {0xa1, 0x00},
1419     {0xa2, 0x00},
1420     {0xa3, 0x00},
1421     {0xa4, 0x00},
1422     {0xa5, 0x00},
1423     {0xa6, 0x10},
1424     {0xa7, 0x00},
1425     {0xa8, 0x18},
1426     {0xa9, 0x00},
1427     {0xaa, 0x00},
1428     {0xab, 0x00},
1429     {0xac, 0x00},
1430     {0xad, 0x00},
1431     {0xae, 0x00},
1432     {0xaf, 0x18},
1433     {0xb0, 0x18},
1434     {0xb1, 0x30},
1435     {0xb2, 0x00},
1436     {0xb3, 0x00},
1437     {0xb4, 0x00},
1438     {0xb5, 0x00},
1439     {0xb6, 0x00},
1440     {0xb7, 0x00},
1441     {0xb8, 0x00},
1442     {0xb9, 0x00},
1443     {0xba, 0x00},
1444     {0xbb, 0x03},
1445     {0xbc, 0x01},
1446     {0xbd, 0x00},
1447     {0xbe, 0x00},
1448     {0xbf, 0x00},
1449     {0xc0, 0x10},
1450     {0xc1, 0x20},
1451     {0xc2, 0x00},
1452     {0xc3, 0x20},
1453     {0xc4, 0x00},
1454     {0xc5, 0x2c},
1455     {0xc6, 0x1c},
1456     {0xc7, 0x10},
1457     {0xc8, 0x10},
1458     {0xc9, 0x01},
1459     {0xca, 0x68},
1460     {0xcb, 0xa7},
1461     {0xcc, 0x3c},
1462     {0xcd, 0x09},
1463     {0xce, 0x00},
1464     {0xcf, 0x20},
1465     {0xd0, 0x40},
1466     {0xd1, 0x10},
1467     {0xd2, 0x00},
1468     {0xd3, 0x00},
1469     {0xd4, 0x20},
1470     {0xd5, 0x28},
1471     {0xd6, 0xa0},
1472     {0xd7, 0x2a},
1473     {0xd8, 0x00},
1474     {0xd9, 0x00},
1475     {0xda, 0x00},
1476     {0xdb, 0x00},
1477     {0xdc, 0x00},
1478     {0xdd, 0x00},
1479     {0xde, 0x00},
1480     {0xdf, 0x00},
1481     {0xe0, 0x00},
1482     {0xe1, 0xd3},
1483     {0xe2, 0xc0},
1484     {0xe3, 0x00},
1485     {0xe4, 0x00},
1486     {0xe5, 0x10},
1487     {0xe6, 0x00},
1488     {0xe7, 0x12},
1489     {0xe8, 0x12},
1490     {0xe9, 0x34},
1491     {0xea, 0x00},
1492     {0xeb, 0xff},
1493     {0xec, 0x79},
1494     {0xed, 0x20},
1495     {0xee, 0x30},
1496     {0xef, 0x01},
1497     {0xf0, 0x00},
1498     {0xf1, 0x3e},
1499     {0xf2, 0x00},
1500     {0xf3, 0x00},
1501     {0xf4, 0x00},
1502     {0xf5, 0x00},
1503     {0xf6, 0x00},
1504     {0xf7, 0x00},
1505     {0xf8, 0x00},
1506     {0xf9, 0x00},
1507     {0xfa, 0x00},
1508     {0xfb, 0x00},
1509     {0xfc, 0x00},
1510     {0xfd, 0x00},
1511     {0xfe, 0x00},
1512     {0xff, 0x00},
1513 };
1514
1515 #define CB_VT3253B0_AGC 193
1516 // For AIROHA
1517 unsigned char byVT3253B0_AGC[CB_VT3253B0_AGC][2] = {
1518     {0xF0, 0x00},
1519     {0xF1, 0x00},
1520     {0xF0, 0x80},
1521     {0xF0, 0x01},
1522     {0xF1, 0x00},
1523     {0xF0, 0x81},
1524     {0xF0, 0x02},
1525     {0xF1, 0x02},
1526     {0xF0, 0x82},
1527     {0xF0, 0x03},
1528     {0xF1, 0x04},
1529     {0xF0, 0x83},
1530     {0xF0, 0x03},
1531     {0xF1, 0x04},
1532     {0xF0, 0x84},
1533     {0xF0, 0x04},
1534     {0xF1, 0x06},
1535     {0xF0, 0x85},
1536     {0xF0, 0x05},
1537     {0xF1, 0x06},
1538     {0xF0, 0x86},
1539     {0xF0, 0x06},
1540     {0xF1, 0x06},
1541     {0xF0, 0x87},
1542     {0xF0, 0x07},
1543     {0xF1, 0x08},
1544     {0xF0, 0x88},
1545     {0xF0, 0x08},
1546     {0xF1, 0x08},
1547     {0xF0, 0x89},
1548     {0xF0, 0x09},
1549     {0xF1, 0x0A},
1550     {0xF0, 0x8A},
1551     {0xF0, 0x0A},
1552     {0xF1, 0x0A},
1553     {0xF0, 0x8B},
1554     {0xF0, 0x0B},
1555     {0xF1, 0x0C},
1556     {0xF0, 0x8C},
1557     {0xF0, 0x0C},
1558     {0xF1, 0x0C},
1559     {0xF0, 0x8D},
1560     {0xF0, 0x0D},
1561     {0xF1, 0x0E},
1562     {0xF0, 0x8E},
1563     {0xF0, 0x0E},
1564     {0xF1, 0x0E},
1565     {0xF0, 0x8F},
1566     {0xF0, 0x0F},
1567     {0xF1, 0x10},
1568     {0xF0, 0x90},
1569     {0xF0, 0x10},
1570     {0xF1, 0x10},
1571     {0xF0, 0x91},
1572     {0xF0, 0x11},
1573     {0xF1, 0x12},
1574     {0xF0, 0x92},
1575     {0xF0, 0x12},
1576     {0xF1, 0x12},
1577     {0xF0, 0x93},
1578     {0xF0, 0x13},
1579     {0xF1, 0x14},
1580     {0xF0, 0x94},
1581     {0xF0, 0x14},
1582     {0xF1, 0x14},
1583     {0xF0, 0x95},
1584     {0xF0, 0x15},
1585     {0xF1, 0x16},
1586     {0xF0, 0x96},
1587     {0xF0, 0x16},
1588     {0xF1, 0x16},
1589     {0xF0, 0x97},
1590     {0xF0, 0x17},
1591     {0xF1, 0x18},
1592     {0xF0, 0x98},
1593     {0xF0, 0x18},
1594     {0xF1, 0x18},
1595     {0xF0, 0x99},
1596     {0xF0, 0x19},
1597     {0xF1, 0x1A},
1598     {0xF0, 0x9A},
1599     {0xF0, 0x1A},
1600     {0xF1, 0x1A},
1601     {0xF0, 0x9B},
1602     {0xF0, 0x1B},
1603     {0xF1, 0x1C},
1604     {0xF0, 0x9C},
1605     {0xF0, 0x1C},
1606     {0xF1, 0x1C},
1607     {0xF0, 0x9D},
1608     {0xF0, 0x1D},
1609     {0xF1, 0x1E},
1610     {0xF0, 0x9E},
1611     {0xF0, 0x1E},
1612     {0xF1, 0x1E},
1613     {0xF0, 0x9F},
1614     {0xF0, 0x1F},
1615     {0xF1, 0x20},
1616     {0xF0, 0xA0},
1617     {0xF0, 0x20},
1618     {0xF1, 0x20},
1619     {0xF0, 0xA1},
1620     {0xF0, 0x21},
1621     {0xF1, 0x22},
1622     {0xF0, 0xA2},
1623     {0xF0, 0x22},
1624     {0xF1, 0x22},
1625     {0xF0, 0xA3},
1626     {0xF0, 0x23},
1627     {0xF1, 0x24},
1628     {0xF0, 0xA4},
1629     {0xF0, 0x24},
1630     {0xF1, 0x24},
1631     {0xF0, 0xA5},
1632     {0xF0, 0x25},
1633     {0xF1, 0x26},
1634     {0xF0, 0xA6},
1635     {0xF0, 0x26},
1636     {0xF1, 0x26},
1637     {0xF0, 0xA7},
1638     {0xF0, 0x27},
1639     {0xF1, 0x28},
1640     {0xF0, 0xA8},
1641     {0xF0, 0x28},
1642     {0xF1, 0x28},
1643     {0xF0, 0xA9},
1644     {0xF0, 0x29},
1645     {0xF1, 0x2A},
1646     {0xF0, 0xAA},
1647     {0xF0, 0x2A},
1648     {0xF1, 0x2A},
1649     {0xF0, 0xAB},
1650     {0xF0, 0x2B},
1651     {0xF1, 0x2C},
1652     {0xF0, 0xAC},
1653     {0xF0, 0x2C},
1654     {0xF1, 0x2C},
1655     {0xF0, 0xAD},
1656     {0xF0, 0x2D},
1657     {0xF1, 0x2E},
1658     {0xF0, 0xAE},
1659     {0xF0, 0x2E},
1660     {0xF1, 0x2E},
1661     {0xF0, 0xAF},
1662     {0xF0, 0x2F},
1663     {0xF1, 0x30},
1664     {0xF0, 0xB0},
1665     {0xF0, 0x30},
1666     {0xF1, 0x30},
1667     {0xF0, 0xB1},
1668     {0xF0, 0x31},
1669     {0xF1, 0x32},
1670     {0xF0, 0xB2},
1671     {0xF0, 0x32},
1672     {0xF1, 0x32},
1673     {0xF0, 0xB3},
1674     {0xF0, 0x33},
1675     {0xF1, 0x34},
1676     {0xF0, 0xB4},
1677     {0xF0, 0x34},
1678     {0xF1, 0x34},
1679     {0xF0, 0xB5},
1680     {0xF0, 0x35},
1681     {0xF1, 0x36},
1682     {0xF0, 0xB6},
1683     {0xF0, 0x36},
1684     {0xF1, 0x36},
1685     {0xF0, 0xB7},
1686     {0xF0, 0x37},
1687     {0xF1, 0x38},
1688     {0xF0, 0xB8},
1689     {0xF0, 0x38},
1690     {0xF1, 0x38},
1691     {0xF0, 0xB9},
1692     {0xF0, 0x39},
1693     {0xF1, 0x3A},
1694     {0xF0, 0xBA},
1695     {0xF0, 0x3A},
1696     {0xF1, 0x3A},
1697     {0xF0, 0xBB},
1698     {0xF0, 0x3B},
1699     {0xF1, 0x3C},
1700     {0xF0, 0xBC},
1701     {0xF0, 0x3C},
1702     {0xF1, 0x3C},
1703     {0xF0, 0xBD},
1704     {0xF0, 0x3D},
1705     {0xF1, 0x3E},
1706     {0xF0, 0xBE},
1707     {0xF0, 0x3E},
1708     {0xF1, 0x3E},
1709     {0xF0, 0xBF},
1710     {0xF0, 0x00},
1711 };
1712
1713 const unsigned short awcFrameTime[MAX_RATE] =
1714 {10, 20, 55, 110, 24, 36, 48, 72, 96, 144, 192, 216};
1715
1716
1717 /*---------------------  Static Functions  --------------------------*/
1718
1719 static
1720 unsigned long
1721 s_ulGetRatio(PSDevice pDevice);
1722
1723 static
1724 void
1725 s_vChangeAntenna(
1726     PSDevice pDevice
1727     );
1728
1729 static
1730 void
1731 s_vChangeAntenna (
1732     PSDevice pDevice
1733     )
1734 {
1735
1736 #ifdef  PLICE_DEBUG
1737         //printk("Enter s_vChangeAntenna:original RxMode is %d,TxMode is %d\n",pDevice->byRxAntennaMode,pDevice->byTxAntennaMode);
1738 #endif
1739     if ( pDevice->dwRxAntennaSel == 0) {
1740         pDevice->dwRxAntennaSel=1;
1741         if (pDevice->bTxRxAntInv == true)
1742             BBvSetRxAntennaMode(pDevice->PortOffset, ANT_A);
1743         else
1744             BBvSetRxAntennaMode(pDevice->PortOffset, ANT_B);
1745     } else {
1746         pDevice->dwRxAntennaSel=0;
1747         if (pDevice->bTxRxAntInv == true)
1748             BBvSetRxAntennaMode(pDevice->PortOffset, ANT_B);
1749         else
1750             BBvSetRxAntennaMode(pDevice->PortOffset, ANT_A);
1751     }
1752     if ( pDevice->dwTxAntennaSel == 0) {
1753         pDevice->dwTxAntennaSel=1;
1754         BBvSetTxAntennaMode(pDevice->PortOffset, ANT_B);
1755     } else {
1756         pDevice->dwTxAntennaSel=0;
1757         BBvSetTxAntennaMode(pDevice->PortOffset, ANT_A);
1758     }
1759 }
1760
1761
1762 /*---------------------  Export Variables  --------------------------*/
1763 /*
1764  * Description: Calculate data frame transmitting time
1765  *
1766  * Parameters:
1767  *  In:
1768  *      byPreambleType  - Preamble Type
1769  *      byPktType        - PK_TYPE_11A, PK_TYPE_11B, PK_TYPE_11GB, PK_TYPE_11GA
1770  *      cbFrameLength   - Baseband Type
1771  *      wRate           - Tx Rate
1772  *  Out:
1773  *
1774  * Return Value: FrameTime
1775  *
1776  */
1777 unsigned int
1778 BBuGetFrameTime (
1779     unsigned char byPreambleType,
1780     unsigned char byPktType,
1781     unsigned int cbFrameLength,
1782     unsigned short wRate
1783     )
1784 {
1785     unsigned int uFrameTime;
1786     unsigned int uPreamble;
1787     unsigned int uTmp;
1788     unsigned int uRateIdx = (unsigned int) wRate;
1789     unsigned int uRate = 0;
1790
1791
1792     if (uRateIdx > RATE_54M) {
1793             ASSERT(0);
1794         return 0;
1795     }
1796
1797     uRate = (unsigned int) awcFrameTime[uRateIdx];
1798
1799     if (uRateIdx <= 3) {          //CCK mode
1800
1801         if (byPreambleType == 1) {//Short
1802             uPreamble = 96;
1803         } else {
1804             uPreamble = 192;
1805         }
1806         uFrameTime = (cbFrameLength * 80) / uRate;  //?????
1807         uTmp = (uFrameTime * uRate) / 80;
1808         if (cbFrameLength != uTmp) {
1809             uFrameTime ++;
1810         }
1811
1812         return (uPreamble + uFrameTime);
1813     }
1814     else {
1815         uFrameTime = (cbFrameLength * 8 + 22) / uRate;   //????????
1816         uTmp = ((uFrameTime * uRate) - 22) / 8;
1817         if(cbFrameLength != uTmp) {
1818             uFrameTime ++;
1819         }
1820         uFrameTime = uFrameTime * 4;    //???????
1821         if(byPktType != PK_TYPE_11A) {
1822             uFrameTime += 6;     //??????
1823         }
1824         return (20 + uFrameTime); //??????
1825     }
1826 }
1827
1828 /*
1829  * Description: Calculate Length, Service, and Signal fields of Phy for Tx
1830  *
1831  * Parameters:
1832  *  In:
1833  *      pDevice         - Device Structure
1834  *      cbFrameLength   - Tx Frame Length
1835  *      wRate           - Tx Rate
1836  *  Out:
1837  *      pwPhyLen        - pointer to Phy Length field
1838  *      pbyPhySrv       - pointer to Phy Service field
1839  *      pbyPhySgn       - pointer to Phy Signal field
1840  *
1841  * Return Value: none
1842  *
1843  */
1844 void
1845 BBvCalculateParameter (
1846     PSDevice pDevice,
1847     unsigned int cbFrameLength,
1848     unsigned short wRate,
1849     unsigned char byPacketType,
1850     unsigned short *pwPhyLen,
1851     unsigned char *pbyPhySrv,
1852     unsigned char *pbyPhySgn
1853     )
1854 {
1855     unsigned int cbBitCount;
1856     unsigned int cbUsCount = 0;
1857     unsigned int cbTmp;
1858     bool bExtBit;
1859     unsigned char byPreambleType = pDevice->byPreambleType;
1860     bool bCCK = pDevice->bCCK;
1861
1862     cbBitCount = cbFrameLength * 8;
1863     bExtBit = false;
1864
1865     switch (wRate) {
1866     case RATE_1M :
1867         cbUsCount = cbBitCount;
1868         *pbyPhySgn = 0x00;
1869         break;
1870
1871     case RATE_2M :
1872         cbUsCount = cbBitCount / 2;
1873         if (byPreambleType == 1)
1874             *pbyPhySgn = 0x09;
1875         else // long preamble
1876             *pbyPhySgn = 0x01;
1877         break;
1878
1879     case RATE_5M :
1880         if (bCCK == false)
1881             cbBitCount ++;
1882         cbUsCount = (cbBitCount * 10) / 55;
1883         cbTmp = (cbUsCount * 55) / 10;
1884         if (cbTmp != cbBitCount)
1885             cbUsCount ++;
1886         if (byPreambleType == 1)
1887             *pbyPhySgn = 0x0a;
1888         else // long preamble
1889             *pbyPhySgn = 0x02;
1890         break;
1891
1892     case RATE_11M :
1893
1894         if (bCCK == false)
1895             cbBitCount ++;
1896         cbUsCount = cbBitCount / 11;
1897         cbTmp = cbUsCount * 11;
1898         if (cbTmp != cbBitCount) {
1899             cbUsCount ++;
1900             if ((cbBitCount - cbTmp) <= 3)
1901                 bExtBit = true;
1902         }
1903         if (byPreambleType == 1)
1904             *pbyPhySgn = 0x0b;
1905         else // long preamble
1906             *pbyPhySgn = 0x03;
1907         break;
1908
1909     case RATE_6M :
1910         if(byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1911             *pbyPhySgn = 0x9B; //1001 1011
1912         }
1913         else {//11g, 2.4GHZ
1914             *pbyPhySgn = 0x8B; //1000 1011
1915         }
1916         break;
1917
1918     case RATE_9M :
1919         if(byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1920             *pbyPhySgn = 0x9F; //1001 1111
1921         }
1922         else {//11g, 2.4GHZ
1923             *pbyPhySgn = 0x8F; //1000 1111
1924         }
1925         break;
1926
1927     case RATE_12M :
1928         if(byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1929             *pbyPhySgn = 0x9A; //1001 1010
1930         }
1931         else {//11g, 2.4GHZ
1932             *pbyPhySgn = 0x8A; //1000 1010
1933         }
1934         break;
1935
1936     case RATE_18M :
1937         if(byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1938             *pbyPhySgn = 0x9E; //1001 1110
1939         }
1940         else {//11g, 2.4GHZ
1941             *pbyPhySgn = 0x8E; //1000 1110
1942         }
1943         break;
1944
1945     case RATE_24M :
1946         if(byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1947             *pbyPhySgn = 0x99; //1001 1001
1948         }
1949         else {//11g, 2.4GHZ
1950             *pbyPhySgn = 0x89; //1000 1001
1951         }
1952         break;
1953
1954     case RATE_36M :
1955         if(byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1956             *pbyPhySgn = 0x9D; //1001 1101
1957         }
1958         else {//11g, 2.4GHZ
1959             *pbyPhySgn = 0x8D; //1000 1101
1960         }
1961         break;
1962
1963     case RATE_48M :
1964         if(byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1965             *pbyPhySgn = 0x98; //1001 1000
1966         }
1967         else {//11g, 2.4GHZ
1968             *pbyPhySgn = 0x88; //1000 1000
1969         }
1970         break;
1971
1972     case RATE_54M :
1973         if (byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1974             *pbyPhySgn = 0x9C; //1001 1100
1975         }
1976         else {//11g, 2.4GHZ
1977             *pbyPhySgn = 0x8C; //1000 1100
1978         }
1979         break;
1980
1981     default :
1982         if (byPacketType == PK_TYPE_11A) {//11a, 5GHZ
1983             *pbyPhySgn = 0x9C; //1001 1100
1984         }
1985         else {//11g, 2.4GHZ
1986             *pbyPhySgn = 0x8C; //1000 1100
1987         }
1988         break;
1989     }
1990
1991     if (byPacketType == PK_TYPE_11B) {
1992         *pbyPhySrv = 0x00;
1993         if (bExtBit)
1994             *pbyPhySrv = *pbyPhySrv | 0x80;
1995         *pwPhyLen = (unsigned short)cbUsCount;
1996     }
1997     else {
1998         *pbyPhySrv = 0x00;
1999         *pwPhyLen = (unsigned short)cbFrameLength;
2000     }
2001 }
2002
2003 /*
2004  * Description: Read a byte from BASEBAND, by embedded programming
2005  *
2006  * Parameters:
2007  *  In:
2008  *      dwIoBase    - I/O base address
2009  *      byBBAddr    - address of register in Baseband
2010  *  Out:
2011  *      pbyData     - data read
2012  *
2013  * Return Value: true if succeeded; false if failed.
2014  *
2015  */
2016 bool BBbReadEmbedded (unsigned long dwIoBase, unsigned char byBBAddr, unsigned char *pbyData)
2017 {
2018     unsigned short ww;
2019     unsigned char byValue;
2020
2021     // BB reg offset
2022     VNSvOutPortB(dwIoBase + MAC_REG_BBREGADR, byBBAddr);
2023
2024     // turn on REGR
2025     MACvRegBitsOn(dwIoBase, MAC_REG_BBREGCTL, BBREGCTL_REGR);
2026     // W_MAX_TIMEOUT is the timeout period
2027     for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
2028         VNSvInPortB(dwIoBase + MAC_REG_BBREGCTL, &byValue);
2029         if (byValue & BBREGCTL_DONE)
2030             break;
2031     }
2032
2033     // get BB data
2034     VNSvInPortB(dwIoBase + MAC_REG_BBREGDATA, pbyData);
2035
2036     if (ww == W_MAX_TIMEOUT) {
2037         DBG_PORT80(0x30);
2038         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" DBG_PORT80(0x30)\n");
2039         return false;
2040     }
2041     return true;
2042 }
2043
2044
2045 /*
2046  * Description: Write a Byte to BASEBAND, by embedded programming
2047  *
2048  * Parameters:
2049  *  In:
2050  *      dwIoBase    - I/O base address
2051  *      byBBAddr    - address of register in Baseband
2052  *      byData      - data to write
2053  *  Out:
2054  *      none
2055  *
2056  * Return Value: true if succeeded; false if failed.
2057  *
2058  */
2059 bool BBbWriteEmbedded (unsigned long dwIoBase, unsigned char byBBAddr, unsigned char byData)
2060 {
2061     unsigned short ww;
2062     unsigned char byValue;
2063
2064     // BB reg offset
2065     VNSvOutPortB(dwIoBase + MAC_REG_BBREGADR, byBBAddr);
2066     // set BB data
2067     VNSvOutPortB(dwIoBase + MAC_REG_BBREGDATA, byData);
2068
2069     // turn on BBREGCTL_REGW
2070     MACvRegBitsOn(dwIoBase, MAC_REG_BBREGCTL, BBREGCTL_REGW);
2071     // W_MAX_TIMEOUT is the timeout period
2072     for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
2073         VNSvInPortB(dwIoBase + MAC_REG_BBREGCTL, &byValue);
2074         if (byValue & BBREGCTL_DONE)
2075             break;
2076     }
2077
2078     if (ww == W_MAX_TIMEOUT) {
2079         DBG_PORT80(0x31);
2080         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" DBG_PORT80(0x31)\n");
2081         return false;
2082     }
2083     return true;
2084 }
2085
2086
2087 /*
2088  * Description: Test if all bits are set for the Baseband register
2089  *
2090  * Parameters:
2091  *  In:
2092  *      dwIoBase    - I/O base address
2093  *      byBBAddr    - address of register in Baseband
2094  *      byTestBits  - TestBits
2095  *  Out:
2096  *      none
2097  *
2098  * Return Value: true if all TestBits are set; false otherwise.
2099  *
2100  */
2101 bool BBbIsRegBitsOn (unsigned long dwIoBase, unsigned char byBBAddr, unsigned char byTestBits)
2102 {
2103     unsigned char byOrgData;
2104
2105     BBbReadEmbedded(dwIoBase, byBBAddr, &byOrgData);
2106     return (byOrgData & byTestBits) == byTestBits;
2107 }
2108
2109
2110 /*
2111  * Description: Test if all bits are clear for the Baseband register
2112  *
2113  * Parameters:
2114  *  In:
2115  *      dwIoBase    - I/O base address
2116  *      byBBAddr    - address of register in Baseband
2117  *      byTestBits  - TestBits
2118  *  Out:
2119  *      none
2120  *
2121  * Return Value: true if all TestBits are clear; false otherwise.
2122  *
2123  */
2124 bool BBbIsRegBitsOff (unsigned long dwIoBase, unsigned char byBBAddr, unsigned char byTestBits)
2125 {
2126     unsigned char byOrgData;
2127
2128     BBbReadEmbedded(dwIoBase, byBBAddr, &byOrgData);
2129     return (byOrgData & byTestBits) == 0;
2130 }
2131
2132 /*
2133  * Description: VIA VT3253 Baseband chip init function
2134  *
2135  * Parameters:
2136  *  In:
2137  *      dwIoBase    - I/O base address
2138  *      byRevId     - Revision ID
2139  *      byRFType    - RF type
2140  *  Out:
2141  *      none
2142  *
2143  * Return Value: true if succeeded; false if failed.
2144  *
2145  */
2146
2147 bool BBbVT3253Init (PSDevice pDevice)
2148 {
2149     bool bResult = true;
2150     int        ii;
2151     unsigned long dwIoBase = pDevice->PortOffset;
2152     unsigned char byRFType = pDevice->byRFType;
2153     unsigned char byLocalID = pDevice->byLocalID;
2154
2155     if (byRFType == RF_RFMD2959) {
2156         if (byLocalID <= REV_ID_VT3253_A1) {
2157             for (ii = 0; ii < CB_VT3253_INIT_FOR_RFMD; ii++) {
2158                 bResult &= BBbWriteEmbedded(dwIoBase,byVT3253InitTab_RFMD[ii][0],byVT3253InitTab_RFMD[ii][1]);
2159             }
2160         } else {
2161             for (ii = 0; ii < CB_VT3253B0_INIT_FOR_RFMD; ii++) {
2162                 bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_RFMD[ii][0],byVT3253B0_RFMD[ii][1]);
2163             }
2164             for (ii = 0; ii < CB_VT3253B0_AGC_FOR_RFMD2959; ii++) {
2165                     bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AGC4_RFMD2959[ii][0],byVT3253B0_AGC4_RFMD2959[ii][1]);
2166             }
2167             VNSvOutPortD(dwIoBase + MAC_REG_ITRTMSET, 0x23);
2168             MACvRegBitsOn(dwIoBase, MAC_REG_PAPEDELAY, BIT0);
2169         }
2170         pDevice->abyBBVGA[0] = 0x18;
2171         pDevice->abyBBVGA[1] = 0x0A;
2172         pDevice->abyBBVGA[2] = 0x0;
2173         pDevice->abyBBVGA[3] = 0x0;
2174         pDevice->ldBmThreshold[0] = -70;
2175         pDevice->ldBmThreshold[1] = -50;
2176         pDevice->ldBmThreshold[2] = 0;
2177         pDevice->ldBmThreshold[3] = 0;
2178     } else if ((byRFType == RF_AIROHA) || (byRFType == RF_AL2230S) ) {
2179         for (ii = 0; ii < CB_VT3253B0_INIT_FOR_AIROHA2230; ii++) {
2180             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AIROHA2230[ii][0],byVT3253B0_AIROHA2230[ii][1]);
2181         }
2182         for (ii = 0; ii < CB_VT3253B0_AGC; ii++) {
2183             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AGC[ii][0],byVT3253B0_AGC[ii][1]);
2184         }
2185         pDevice->abyBBVGA[0] = 0x1C;
2186         pDevice->abyBBVGA[1] = 0x10;
2187         pDevice->abyBBVGA[2] = 0x0;
2188         pDevice->abyBBVGA[3] = 0x0;
2189         pDevice->ldBmThreshold[0] = -70;
2190         pDevice->ldBmThreshold[1] = -48;
2191         pDevice->ldBmThreshold[2] = 0;
2192         pDevice->ldBmThreshold[3] = 0;
2193     } else if (byRFType == RF_UW2451) {
2194         for (ii = 0; ii < CB_VT3253B0_INIT_FOR_UW2451; ii++) {
2195                 bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_UW2451[ii][0],byVT3253B0_UW2451[ii][1]);
2196         }
2197         for (ii = 0; ii < CB_VT3253B0_AGC; ii++) {
2198             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AGC[ii][0],byVT3253B0_AGC[ii][1]);
2199         }
2200         VNSvOutPortB(dwIoBase + MAC_REG_ITRTMSET, 0x23);
2201         MACvRegBitsOn(dwIoBase, MAC_REG_PAPEDELAY, BIT0);
2202
2203         pDevice->abyBBVGA[0] = 0x14;
2204         pDevice->abyBBVGA[1] = 0x0A;
2205         pDevice->abyBBVGA[2] = 0x0;
2206         pDevice->abyBBVGA[3] = 0x0;
2207         pDevice->ldBmThreshold[0] = -60;
2208         pDevice->ldBmThreshold[1] = -50;
2209         pDevice->ldBmThreshold[2] = 0;
2210         pDevice->ldBmThreshold[3] = 0;
2211     } else if (byRFType == RF_UW2452) {
2212         for (ii = 0; ii < CB_VT3253B0_INIT_FOR_UW2451; ii++) {
2213             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_UW2451[ii][0],byVT3253B0_UW2451[ii][1]);
2214         }
2215         // Init ANT B select,TX Config CR09 = 0x61->0x45, 0x45->0x41(VC1/VC2 define, make the ANT_A, ANT_B inverted)
2216         //bResult &= BBbWriteEmbedded(dwIoBase,0x09,0x41);
2217         // Init ANT B select,RX Config CR10 = 0x28->0x2A, 0x2A->0x28(VC1/VC2 define, make the ANT_A, ANT_B inverted)
2218         //bResult &= BBbWriteEmbedded(dwIoBase,0x0a,0x28);
2219         // Select VC1/VC2, CR215 = 0x02->0x06
2220         bResult &= BBbWriteEmbedded(dwIoBase,0xd7,0x06);
2221
2222         //{{RobertYu:20050125, request by Jack
2223         bResult &= BBbWriteEmbedded(dwIoBase,0x90,0x20);
2224         bResult &= BBbWriteEmbedded(dwIoBase,0x97,0xeb);
2225         //}}
2226
2227         //{{RobertYu:20050221, request by Jack
2228         bResult &= BBbWriteEmbedded(dwIoBase,0xa6,0x00);
2229         bResult &= BBbWriteEmbedded(dwIoBase,0xa8,0x30);
2230         //}}
2231         bResult &= BBbWriteEmbedded(dwIoBase,0xb0,0x58);
2232
2233         for (ii = 0; ii < CB_VT3253B0_AGC; ii++) {
2234             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AGC[ii][0],byVT3253B0_AGC[ii][1]);
2235         }
2236         //VNSvOutPortB(dwIoBase + MAC_REG_ITRTMSET, 0x23); // RobertYu: 20050104, 20050131 disable PA_Delay
2237         //MACvRegBitsOn(dwIoBase, MAC_REG_PAPEDELAY, BIT0); // RobertYu: 20050104, 20050131 disable PA_Delay
2238
2239         pDevice->abyBBVGA[0] = 0x14;
2240         pDevice->abyBBVGA[1] = 0x0A;
2241         pDevice->abyBBVGA[2] = 0x0;
2242         pDevice->abyBBVGA[3] = 0x0;
2243         pDevice->ldBmThreshold[0] = -60;
2244         pDevice->ldBmThreshold[1] = -50;
2245         pDevice->ldBmThreshold[2] = 0;
2246         pDevice->ldBmThreshold[3] = 0;
2247     //}} RobertYu
2248
2249     } else if (byRFType == RF_VT3226) {
2250         for (ii = 0; ii < CB_VT3253B0_INIT_FOR_AIROHA2230; ii++) {
2251             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AIROHA2230[ii][0],byVT3253B0_AIROHA2230[ii][1]);
2252         }
2253         for (ii = 0; ii < CB_VT3253B0_AGC; ii++) {
2254             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AGC[ii][0],byVT3253B0_AGC[ii][1]);
2255         }
2256         pDevice->abyBBVGA[0] = 0x1C;
2257         pDevice->abyBBVGA[1] = 0x10;
2258         pDevice->abyBBVGA[2] = 0x0;
2259         pDevice->abyBBVGA[3] = 0x0;
2260         pDevice->ldBmThreshold[0] = -70;
2261         pDevice->ldBmThreshold[1] = -48;
2262         pDevice->ldBmThreshold[2] = 0;
2263         pDevice->ldBmThreshold[3] = 0;
2264         // Fix VT3226 DFC system timing issue
2265         MACvSetRFLE_LatchBase(dwIoBase);
2266          //{{ RobertYu: 20050104
2267     } else if (byRFType == RF_AIROHA7230) {
2268         for (ii = 0; ii < CB_VT3253B0_INIT_FOR_AIROHA2230; ii++) {
2269             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AIROHA2230[ii][0],byVT3253B0_AIROHA2230[ii][1]);
2270         }
2271
2272         //{{ RobertYu:20050223, request by JerryChung
2273         // Init ANT B select,TX Config CR09 = 0x61->0x45, 0x45->0x41(VC1/VC2 define, make the ANT_A, ANT_B inverted)
2274         //bResult &= BBbWriteEmbedded(dwIoBase,0x09,0x41);
2275         // Init ANT B select,RX Config CR10 = 0x28->0x2A, 0x2A->0x28(VC1/VC2 define, make the ANT_A, ANT_B inverted)
2276         //bResult &= BBbWriteEmbedded(dwIoBase,0x0a,0x28);
2277         // Select VC1/VC2, CR215 = 0x02->0x06
2278         bResult &= BBbWriteEmbedded(dwIoBase,0xd7,0x06);
2279         //}}
2280
2281         for (ii = 0; ii < CB_VT3253B0_AGC; ii++) {
2282             bResult &= BBbWriteEmbedded(dwIoBase,byVT3253B0_AGC[ii][0],byVT3253B0_AGC[ii][1]);
2283         }
2284         pDevice->abyBBVGA[0] = 0x1C;
2285         pDevice->abyBBVGA[1] = 0x10;
2286         pDevice->abyBBVGA[2] = 0x0;
2287         pDevice->abyBBVGA[3] = 0x0;
2288         pDevice->ldBmThreshold[0] = -70;
2289         pDevice->ldBmThreshold[1] = -48;
2290         pDevice->ldBmThreshold[2] = 0;
2291         pDevice->ldBmThreshold[3] = 0;
2292     //}} RobertYu
2293     } else {
2294         // No VGA Table now
2295         pDevice->bUpdateBBVGA = false;
2296         pDevice->abyBBVGA[0] = 0x1C;
2297     }
2298
2299     if (byLocalID > REV_ID_VT3253_A1) {
2300         BBbWriteEmbedded(dwIoBase, 0x04, 0x7F);
2301         BBbWriteEmbedded(dwIoBase, 0x0D, 0x01);
2302     }
2303
2304     return bResult;
2305 }
2306
2307
2308
2309 /*
2310  * Description: Read All Baseband Registers
2311  *
2312  * Parameters:
2313  *  In:
2314  *      dwIoBase    - I/O base address
2315  *      pbyBBRegs   - Point to struct that stores Baseband Registers
2316  *  Out:
2317  *      none
2318  *
2319  * Return Value: none
2320  *
2321  */
2322 void BBvReadAllRegs (unsigned long dwIoBase, unsigned char *pbyBBRegs)
2323 {
2324     int  ii;
2325     unsigned char byBase = 1;
2326     for (ii = 0; ii < BB_MAX_CONTEXT_SIZE; ii++) {
2327         BBbReadEmbedded(dwIoBase, (unsigned char)(ii*byBase), pbyBBRegs);
2328         pbyBBRegs += byBase;
2329     }
2330 }
2331
2332 /*
2333  * Description: Turn on BaseBand Loopback mode
2334  *
2335  * Parameters:
2336  *  In:
2337  *      dwIoBase    - I/O base address
2338  *      bCCK        - If CCK is set
2339  *  Out:
2340  *      none
2341  *
2342  * Return Value: none
2343  *
2344  */
2345
2346
2347 void BBvLoopbackOn (PSDevice pDevice)
2348 {
2349     unsigned char byData;
2350     unsigned long dwIoBase = pDevice->PortOffset;
2351
2352     //CR C9 = 0x00
2353     BBbReadEmbedded(dwIoBase, 0xC9, &pDevice->byBBCRc9);//CR201
2354     BBbWriteEmbedded(dwIoBase, 0xC9, 0);
2355     BBbReadEmbedded(dwIoBase, 0x4D, &pDevice->byBBCR4d);//CR77
2356     BBbWriteEmbedded(dwIoBase, 0x4D, 0x90);
2357
2358     //CR 88 = 0x02(CCK), 0x03(OFDM)
2359     BBbReadEmbedded(dwIoBase, 0x88, &pDevice->byBBCR88);//CR136
2360
2361     if (pDevice->uConnectionRate <= RATE_11M) { //CCK
2362         // Enable internal digital loopback: CR33 |= 0000 0001
2363         BBbReadEmbedded(dwIoBase, 0x21, &byData);//CR33
2364         BBbWriteEmbedded(dwIoBase, 0x21, (unsigned char)(byData | 0x01));//CR33
2365         // CR154 = 0x00
2366         BBbWriteEmbedded(dwIoBase, 0x9A, 0);   //CR154
2367
2368         BBbWriteEmbedded(dwIoBase, 0x88, 0x02);//CR239
2369     }
2370     else { //OFDM
2371         // Enable internal digital loopback:CR154 |= 0000 0001
2372         BBbReadEmbedded(dwIoBase, 0x9A, &byData);//CR154
2373         BBbWriteEmbedded(dwIoBase, 0x9A, (unsigned char)(byData | 0x01));//CR154
2374         // CR33 = 0x00
2375         BBbWriteEmbedded(dwIoBase, 0x21, 0);   //CR33
2376
2377         BBbWriteEmbedded(dwIoBase, 0x88, 0x03);//CR239
2378     }
2379
2380     //CR14 = 0x00
2381     BBbWriteEmbedded(dwIoBase, 0x0E, 0);//CR14
2382
2383     // Disable TX_IQUN
2384     BBbReadEmbedded(pDevice->PortOffset, 0x09, &pDevice->byBBCR09);
2385     BBbWriteEmbedded(pDevice->PortOffset, 0x09, (unsigned char)(pDevice->byBBCR09 & 0xDE));
2386 }
2387
2388 /*
2389  * Description: Turn off BaseBand Loopback mode
2390  *
2391  * Parameters:
2392  *  In:
2393  *      pDevice         - Device Structure
2394  *
2395  *  Out:
2396  *      none
2397  *
2398  * Return Value: none
2399  *
2400  */
2401 void BBvLoopbackOff (PSDevice pDevice)
2402 {
2403     unsigned char byData;
2404     unsigned long dwIoBase = pDevice->PortOffset;
2405
2406     BBbWriteEmbedded(dwIoBase, 0xC9, pDevice->byBBCRc9);//CR201
2407     BBbWriteEmbedded(dwIoBase, 0x88, pDevice->byBBCR88);//CR136
2408     BBbWriteEmbedded(dwIoBase, 0x09, pDevice->byBBCR09);//CR136
2409     BBbWriteEmbedded(dwIoBase, 0x4D, pDevice->byBBCR4d);//CR77
2410
2411     if (pDevice->uConnectionRate <= RATE_11M) { // CCK
2412         // Set the CR33 Bit2 to disable internal Loopback.
2413         BBbReadEmbedded(dwIoBase, 0x21, &byData);//CR33
2414         BBbWriteEmbedded(dwIoBase, 0x21, (unsigned char)(byData & 0xFE));//CR33
2415     }
2416     else { // OFDM
2417         BBbReadEmbedded(dwIoBase, 0x9A, &byData);//CR154
2418         BBbWriteEmbedded(dwIoBase, 0x9A, (unsigned char)(byData & 0xFE));//CR154
2419     }
2420     BBbReadEmbedded(dwIoBase, 0x0E, &byData);//CR14
2421     BBbWriteEmbedded(dwIoBase, 0x0E, (unsigned char)(byData | 0x80));//CR14
2422
2423 }
2424
2425
2426
2427 /*
2428  * Description: Set ShortSlotTime mode
2429  *
2430  * Parameters:
2431  *  In:
2432  *      pDevice     - Device Structure
2433  *  Out:
2434  *      none
2435  *
2436  * Return Value: none
2437  *
2438  */
2439 void
2440 BBvSetShortSlotTime (PSDevice pDevice)
2441 {
2442     unsigned char byBBRxConf=0;
2443     unsigned char byBBVGA=0;
2444
2445     BBbReadEmbedded(pDevice->PortOffset, 0x0A, &byBBRxConf);//CR10
2446
2447     if (pDevice->bShortSlotTime) {
2448         byBBRxConf &= 0xDF;//1101 1111
2449     } else {
2450         byBBRxConf |= 0x20;//0010 0000
2451     }
2452
2453     // patch for 3253B0 Baseband with Cardbus module
2454     BBbReadEmbedded(pDevice->PortOffset, 0xE7, &byBBVGA);
2455     if (byBBVGA == pDevice->abyBBVGA[0]) {
2456         byBBRxConf |= 0x20;//0010 0000
2457     }
2458
2459     BBbWriteEmbedded(pDevice->PortOffset, 0x0A, byBBRxConf);//CR10
2460
2461 }
2462
2463 void BBvSetVGAGainOffset(PSDevice pDevice, unsigned char byData)
2464 {
2465     unsigned char byBBRxConf=0;
2466
2467     BBbWriteEmbedded(pDevice->PortOffset, 0xE7, byData);
2468
2469     BBbReadEmbedded(pDevice->PortOffset, 0x0A, &byBBRxConf);//CR10
2470     // patch for 3253B0 Baseband with Cardbus module
2471     if (byData == pDevice->abyBBVGA[0]) {
2472         byBBRxConf |= 0x20;//0010 0000
2473     } else if (pDevice->bShortSlotTime) {
2474         byBBRxConf &= 0xDF;//1101 1111
2475     } else {
2476         byBBRxConf |= 0x20;//0010 0000
2477     }
2478     pDevice->byBBVGACurrent = byData;
2479     BBbWriteEmbedded(pDevice->PortOffset, 0x0A, byBBRxConf);//CR10
2480 }
2481
2482
2483 /*
2484  * Description: Baseband SoftwareReset
2485  *
2486  * Parameters:
2487  *  In:
2488  *      dwIoBase    - I/O base address
2489  *  Out:
2490  *      none
2491  *
2492  * Return Value: none
2493  *
2494  */
2495 void
2496 BBvSoftwareReset (unsigned long dwIoBase)
2497 {
2498     BBbWriteEmbedded(dwIoBase, 0x50, 0x40);
2499     BBbWriteEmbedded(dwIoBase, 0x50, 0);
2500     BBbWriteEmbedded(dwIoBase, 0x9C, 0x01);
2501     BBbWriteEmbedded(dwIoBase, 0x9C, 0);
2502 }
2503
2504 /*
2505  * Description: Baseband Power Save Mode ON
2506  *
2507  * Parameters:
2508  *  In:
2509  *      dwIoBase    - I/O base address
2510  *  Out:
2511  *      none
2512  *
2513  * Return Value: none
2514  *
2515  */
2516 void
2517 BBvPowerSaveModeON (unsigned long dwIoBase)
2518 {
2519     unsigned char byOrgData;
2520
2521     BBbReadEmbedded(dwIoBase, 0x0D, &byOrgData);
2522     byOrgData |= BIT0;
2523     BBbWriteEmbedded(dwIoBase, 0x0D, byOrgData);
2524 }
2525
2526 /*
2527  * Description: Baseband Power Save Mode OFF
2528  *
2529  * Parameters:
2530  *  In:
2531  *      dwIoBase    - I/O base address
2532  *  Out:
2533  *      none
2534  *
2535  * Return Value: none
2536  *
2537  */
2538 void
2539 BBvPowerSaveModeOFF (unsigned long dwIoBase)
2540 {
2541     unsigned char byOrgData;
2542
2543     BBbReadEmbedded(dwIoBase, 0x0D, &byOrgData);
2544     byOrgData &= ~(BIT0);
2545     BBbWriteEmbedded(dwIoBase, 0x0D, byOrgData);
2546 }
2547
2548 /*
2549  * Description: Set Tx Antenna mode
2550  *
2551  * Parameters:
2552  *  In:
2553  *      pDevice          - Device Structure
2554  *      byAntennaMode    - Antenna Mode
2555  *  Out:
2556  *      none
2557  *
2558  * Return Value: none
2559  *
2560  */
2561
2562 void
2563 BBvSetTxAntennaMode (unsigned long dwIoBase, unsigned char byAntennaMode)
2564 {
2565     unsigned char byBBTxConf;
2566
2567 #ifdef  PLICE_DEBUG
2568         //printk("Enter BBvSetTxAntennaMode\n");
2569 #endif
2570     BBbReadEmbedded(dwIoBase, 0x09, &byBBTxConf);//CR09
2571     if (byAntennaMode == ANT_DIVERSITY) {
2572         // bit 1 is diversity
2573         byBBTxConf |= 0x02;
2574     } else if (byAntennaMode == ANT_A) {
2575         // bit 2 is ANTSEL
2576         byBBTxConf &= 0xF9; // 1111 1001
2577     } else if (byAntennaMode == ANT_B) {
2578 #ifdef  PLICE_DEBUG
2579         //printk("BBvSetTxAntennaMode:ANT_B\n");
2580 #endif
2581         byBBTxConf &= 0xFD; // 1111 1101
2582         byBBTxConf |= 0x04;
2583     }
2584     BBbWriteEmbedded(dwIoBase, 0x09, byBBTxConf);//CR09
2585 }
2586
2587
2588
2589
2590 /*
2591  * Description: Set Rx Antenna mode
2592  *
2593  * Parameters:
2594  *  In:
2595  *      pDevice          - Device Structure
2596  *      byAntennaMode    - Antenna Mode
2597  *  Out:
2598  *      none
2599  *
2600  * Return Value: none
2601  *
2602  */
2603
2604 void
2605 BBvSetRxAntennaMode (unsigned long dwIoBase, unsigned char byAntennaMode)
2606 {
2607     unsigned char byBBRxConf;
2608
2609     BBbReadEmbedded(dwIoBase, 0x0A, &byBBRxConf);//CR10
2610     if (byAntennaMode == ANT_DIVERSITY) {
2611         byBBRxConf |= 0x01;
2612
2613     } else if (byAntennaMode == ANT_A) {
2614         byBBRxConf &= 0xFC; // 1111 1100
2615     } else if (byAntennaMode == ANT_B) {
2616         byBBRxConf &= 0xFE; // 1111 1110
2617         byBBRxConf |= 0x02;
2618     }
2619     BBbWriteEmbedded(dwIoBase, 0x0A, byBBRxConf);//CR10
2620 }
2621
2622
2623 /*
2624  * Description: BBvSetDeepSleep
2625  *
2626  * Parameters:
2627  *  In:
2628  *      pDevice          - Device Structure
2629  *  Out:
2630  *      none
2631  *
2632  * Return Value: none
2633  *
2634  */
2635 void
2636 BBvSetDeepSleep (unsigned long dwIoBase, unsigned char byLocalID)
2637 {
2638     BBbWriteEmbedded(dwIoBase, 0x0C, 0x17);//CR12
2639     BBbWriteEmbedded(dwIoBase, 0x0D, 0xB9);//CR13
2640 }
2641
2642 void
2643 BBvExitDeepSleep (unsigned long dwIoBase, unsigned char byLocalID)
2644 {
2645     BBbWriteEmbedded(dwIoBase, 0x0C, 0x00);//CR12
2646     BBbWriteEmbedded(dwIoBase, 0x0D, 0x01);//CR13
2647 }
2648
2649
2650
2651 static
2652 unsigned long
2653 s_ulGetRatio (PSDevice pDevice)
2654 {
2655 unsigned long ulRatio = 0;
2656 unsigned long ulMaxPacket;
2657 unsigned long ulPacketNum;
2658
2659     //This is a thousand-ratio
2660     ulMaxPacket = pDevice->uNumSQ3[RATE_54M];
2661     if ( pDevice->uNumSQ3[RATE_54M] != 0 ) {
2662         ulPacketNum = pDevice->uNumSQ3[RATE_54M];
2663         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2664         //ulRatio = (pDevice->uNumSQ3[RATE_54M] * 1000 / pDevice->uDiversityCnt);
2665         ulRatio += TOP_RATE_54M;
2666     }
2667     if ( pDevice->uNumSQ3[RATE_48M] > ulMaxPacket ) {
2668         ulPacketNum = pDevice->uNumSQ3[RATE_54M] + pDevice->uNumSQ3[RATE_48M];
2669         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2670         //ulRatio = (pDevice->uNumSQ3[RATE_48M] * 1000 / pDevice->uDiversityCnt);
2671         ulRatio += TOP_RATE_48M;
2672         ulMaxPacket = pDevice->uNumSQ3[RATE_48M];
2673     }
2674     if ( pDevice->uNumSQ3[RATE_36M] > ulMaxPacket ) {
2675         ulPacketNum = pDevice->uNumSQ3[RATE_54M] + pDevice->uNumSQ3[RATE_48M] +
2676                       pDevice->uNumSQ3[RATE_36M];
2677         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2678         //ulRatio = (pDevice->uNumSQ3[RATE_36M] * 1000 / pDevice->uDiversityCnt);
2679         ulRatio += TOP_RATE_36M;
2680         ulMaxPacket = pDevice->uNumSQ3[RATE_36M];
2681     }
2682     if ( pDevice->uNumSQ3[RATE_24M] > ulMaxPacket ) {
2683         ulPacketNum = pDevice->uNumSQ3[RATE_54M] + pDevice->uNumSQ3[RATE_48M] +
2684                       pDevice->uNumSQ3[RATE_36M] + pDevice->uNumSQ3[RATE_24M];
2685         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2686         //ulRatio = (pDevice->uNumSQ3[RATE_24M] * 1000 / pDevice->uDiversityCnt);
2687         ulRatio += TOP_RATE_24M;
2688         ulMaxPacket = pDevice->uNumSQ3[RATE_24M];
2689     }
2690     if ( pDevice->uNumSQ3[RATE_18M] > ulMaxPacket ) {
2691         ulPacketNum = pDevice->uNumSQ3[RATE_54M] + pDevice->uNumSQ3[RATE_48M] +
2692                       pDevice->uNumSQ3[RATE_36M] + pDevice->uNumSQ3[RATE_24M] +
2693                       pDevice->uNumSQ3[RATE_18M];
2694         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2695         //ulRatio = (pDevice->uNumSQ3[RATE_18M] * 1000 / pDevice->uDiversityCnt);
2696         ulRatio += TOP_RATE_18M;
2697         ulMaxPacket = pDevice->uNumSQ3[RATE_18M];
2698     }
2699     if ( pDevice->uNumSQ3[RATE_12M] > ulMaxPacket ) {
2700         ulPacketNum = pDevice->uNumSQ3[RATE_54M] + pDevice->uNumSQ3[RATE_48M] +
2701                       pDevice->uNumSQ3[RATE_36M] + pDevice->uNumSQ3[RATE_24M] +
2702                       pDevice->uNumSQ3[RATE_18M] + pDevice->uNumSQ3[RATE_12M];
2703         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2704         //ulRatio = (pDevice->uNumSQ3[RATE_12M] * 1000 / pDevice->uDiversityCnt);
2705         ulRatio += TOP_RATE_12M;
2706         ulMaxPacket = pDevice->uNumSQ3[RATE_12M];
2707     }
2708     if ( pDevice->uNumSQ3[RATE_11M] > ulMaxPacket ) {
2709         ulPacketNum = pDevice->uDiversityCnt - pDevice->uNumSQ3[RATE_1M] -
2710                       pDevice->uNumSQ3[RATE_2M] - pDevice->uNumSQ3[RATE_5M] -
2711                       pDevice->uNumSQ3[RATE_6M] - pDevice->uNumSQ3[RATE_9M];
2712         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2713         //ulRatio = (pDevice->uNumSQ3[RATE_11M] * 1000 / pDevice->uDiversityCnt);
2714         ulRatio += TOP_RATE_11M;
2715         ulMaxPacket = pDevice->uNumSQ3[RATE_11M];
2716     }
2717     if ( pDevice->uNumSQ3[RATE_9M] > ulMaxPacket ) {
2718         ulPacketNum = pDevice->uDiversityCnt - pDevice->uNumSQ3[RATE_1M] -
2719                       pDevice->uNumSQ3[RATE_2M] - pDevice->uNumSQ3[RATE_5M] -
2720                       pDevice->uNumSQ3[RATE_6M];
2721         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2722         //ulRatio = (pDevice->uNumSQ3[RATE_9M] * 1000 / pDevice->uDiversityCnt);
2723         ulRatio += TOP_RATE_9M;
2724         ulMaxPacket = pDevice->uNumSQ3[RATE_9M];
2725     }
2726     if ( pDevice->uNumSQ3[RATE_6M] > ulMaxPacket ) {
2727         ulPacketNum = pDevice->uDiversityCnt - pDevice->uNumSQ3[RATE_1M] -
2728                       pDevice->uNumSQ3[RATE_2M] - pDevice->uNumSQ3[RATE_5M];
2729         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2730         //ulRatio = (pDevice->uNumSQ3[RATE_6M] * 1000 / pDevice->uDiversityCnt);
2731         ulRatio += TOP_RATE_6M;
2732         ulMaxPacket = pDevice->uNumSQ3[RATE_6M];
2733     }
2734     if ( pDevice->uNumSQ3[RATE_5M] > ulMaxPacket ) {
2735         ulPacketNum = pDevice->uDiversityCnt - pDevice->uNumSQ3[RATE_1M] -
2736                       pDevice->uNumSQ3[RATE_2M];
2737         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2738         //ulRatio = (pDevice->uNumSQ3[RATE_5M] * 1000 / pDevice->uDiversityCnt);
2739         ulRatio += TOP_RATE_55M;
2740         ulMaxPacket = pDevice->uNumSQ3[RATE_5M];
2741     }
2742     if ( pDevice->uNumSQ3[RATE_2M] > ulMaxPacket ) {
2743         ulPacketNum = pDevice->uDiversityCnt - pDevice->uNumSQ3[RATE_1M];
2744         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2745         //ulRatio = (pDevice->uNumSQ3[RATE_2M]  * 1000 / pDevice->uDiversityCnt);
2746         ulRatio += TOP_RATE_2M;
2747         ulMaxPacket = pDevice->uNumSQ3[RATE_2M];
2748     }
2749     if ( pDevice->uNumSQ3[RATE_1M] > ulMaxPacket ) {
2750         ulPacketNum = pDevice->uDiversityCnt;
2751         ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt);
2752         //ulRatio = (pDevice->uNumSQ3[RATE_1M]  * 1000 / pDevice->uDiversityCnt);
2753         ulRatio += TOP_RATE_1M;
2754     }
2755
2756     return ulRatio;
2757 }
2758
2759
2760 void
2761 BBvClearAntDivSQ3Value (PSDevice pDevice)
2762 {
2763     unsigned int ii;
2764
2765     pDevice->uDiversityCnt = 0;
2766     for (ii = 0; ii < MAX_RATE; ii++) {
2767         pDevice->uNumSQ3[ii] = 0;
2768     }
2769 }
2770
2771
2772 /*
2773  * Description: Antenna Diversity
2774  *
2775  * Parameters:
2776  *  In:
2777  *      pDevice          - Device Structure
2778  *      byRSR            - RSR from received packet
2779  *      bySQ3            - SQ3 value from received packet
2780  *  Out:
2781  *      none
2782  *
2783  * Return Value: none
2784  *
2785  */
2786
2787 void
2788 BBvAntennaDiversity (PSDevice pDevice, unsigned char byRxRate, unsigned char bySQ3)
2789 {
2790
2791     if ((byRxRate >= MAX_RATE) || (pDevice->wAntDiversityMaxRate >= MAX_RATE)) {
2792         return;
2793     }
2794     pDevice->uDiversityCnt++;
2795    // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->uDiversityCnt = %d\n", (int)pDevice->uDiversityCnt);
2796
2797     pDevice->uNumSQ3[byRxRate]++;
2798
2799     if (pDevice->byAntennaState == 0) {
2800
2801         if (pDevice->uDiversityCnt > pDevice->ulDiversityNValue) {
2802             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ulDiversityNValue=[%d],54M-[%d]\n",
2803                           (int)pDevice->ulDiversityNValue, (int)pDevice->uNumSQ3[(int)pDevice->wAntDiversityMaxRate]);
2804
2805             if (pDevice->uNumSQ3[pDevice->wAntDiversityMaxRate] < pDevice->uDiversityCnt/2) {
2806
2807                 pDevice->ulRatio_State0 = s_ulGetRatio(pDevice);
2808                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"SQ3_State0, rate = [%08x]\n", (int)pDevice->ulRatio_State0);
2809
2810                 if ( pDevice->byTMax == 0 )
2811                     return;
2812                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1.[%08x], uNumSQ3[%d]=%d, %d\n",
2813                               (int)pDevice->ulRatio_State0, (int)pDevice->wAntDiversityMaxRate,
2814                               (int)pDevice->uNumSQ3[(int)pDevice->wAntDiversityMaxRate], (int)pDevice->uDiversityCnt);
2815 #ifdef  PLICE_DEBUG
2816                 //printk("BBvAntennaDiversity1:call s_vChangeAntenna\n");
2817 #endif
2818                 s_vChangeAntenna(pDevice);
2819                 pDevice->byAntennaState = 1;
2820                 del_timer(&pDevice->TimerSQ3Tmax3);
2821                 del_timer(&pDevice->TimerSQ3Tmax2);
2822                 pDevice->TimerSQ3Tmax1.expires =  RUN_AT(pDevice->byTMax * HZ);
2823                 add_timer(&pDevice->TimerSQ3Tmax1);
2824
2825             } else {
2826
2827                 pDevice->TimerSQ3Tmax3.expires =  RUN_AT(pDevice->byTMax3 * HZ);
2828                 add_timer(&pDevice->TimerSQ3Tmax3);
2829             }
2830             BBvClearAntDivSQ3Value(pDevice);
2831
2832         }
2833     } else { //byAntennaState == 1
2834
2835         if (pDevice->uDiversityCnt > pDevice->ulDiversityMValue) {
2836
2837             del_timer(&pDevice->TimerSQ3Tmax1);
2838
2839             pDevice->ulRatio_State1 = s_ulGetRatio(pDevice);
2840             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RX:SQ3_State1, rate0 = %08x,rate1 = %08x\n",
2841                           (int)pDevice->ulRatio_State0,(int)pDevice->ulRatio_State1);
2842
2843             if (pDevice->ulRatio_State1 < pDevice->ulRatio_State0) {
2844                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2.[%08x][%08x], uNumSQ3[%d]=%d, %d\n",
2845                               (int)pDevice->ulRatio_State0, (int)pDevice->ulRatio_State1,
2846                               (int)pDevice->wAntDiversityMaxRate,
2847                               (int)pDevice->uNumSQ3[(int)pDevice->wAntDiversityMaxRate], (int)pDevice->uDiversityCnt);
2848 #ifdef  PLICE_DEBUG
2849                 //printk("BBvAntennaDiversity2:call s_vChangeAntenna\n");
2850 #endif
2851                                 s_vChangeAntenna(pDevice);
2852                 pDevice->TimerSQ3Tmax3.expires =  RUN_AT(pDevice->byTMax3 * HZ);
2853                 pDevice->TimerSQ3Tmax2.expires =  RUN_AT(pDevice->byTMax2 * HZ);
2854                 add_timer(&pDevice->TimerSQ3Tmax3);
2855                 add_timer(&pDevice->TimerSQ3Tmax2);
2856             }
2857             pDevice->byAntennaState = 0;
2858             BBvClearAntDivSQ3Value(pDevice);
2859         }
2860     } //byAntennaState
2861 }
2862
2863 /*+
2864  *
2865  * Description:
2866  *  Timer for SQ3 antenna diversity
2867  *
2868  * Parameters:
2869  *  In:
2870  *  Out:
2871  *      none
2872  *
2873  * Return Value: none
2874  *
2875 -*/
2876
2877 void
2878 TimerSQ3CallBack (
2879     void *hDeviceContext
2880     )
2881 {
2882     PSDevice        pDevice = (PSDevice)hDeviceContext;
2883
2884     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"TimerSQ3CallBack...");
2885     spin_lock_irq(&pDevice->lock);
2886
2887     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.[%08x][%08x], %d\n",(int)pDevice->ulRatio_State0, (int)pDevice->ulRatio_State1, (int)pDevice->uDiversityCnt);
2888 #ifdef  PLICE_DEBUG
2889                 //printk("TimerSQ3CallBack1:call s_vChangeAntenna\n");
2890 #endif
2891
2892     s_vChangeAntenna(pDevice);
2893     pDevice->byAntennaState = 0;
2894     BBvClearAntDivSQ3Value(pDevice);
2895
2896     pDevice->TimerSQ3Tmax3.expires =  RUN_AT(pDevice->byTMax3 * HZ);
2897     pDevice->TimerSQ3Tmax2.expires =  RUN_AT(pDevice->byTMax2 * HZ);
2898     add_timer(&pDevice->TimerSQ3Tmax3);
2899     add_timer(&pDevice->TimerSQ3Tmax2);
2900
2901
2902     spin_unlock_irq(&pDevice->lock);
2903     return;
2904 }
2905
2906
2907 /*+
2908  *
2909  * Description:
2910  *  Timer for SQ3 antenna diversity
2911  *
2912  * Parameters:
2913  *  In:
2914  *      pvSysSpec1
2915  *      hDeviceContext - Pointer to the adapter
2916  *      pvSysSpec2
2917  *      pvSysSpec3
2918  *  Out:
2919  *      none
2920  *
2921  * Return Value: none
2922  *
2923 -*/
2924
2925 void
2926 TimerState1CallBack (
2927     void *hDeviceContext
2928     )
2929 {
2930     PSDevice        pDevice = (PSDevice)hDeviceContext;
2931
2932     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"TimerState1CallBack...");
2933
2934     spin_lock_irq(&pDevice->lock);
2935     if (pDevice->uDiversityCnt < pDevice->ulDiversityMValue/100) {
2936 #ifdef  PLICE_DEBUG
2937                 //printk("TimerSQ3CallBack2:call s_vChangeAntenna\n");
2938 #endif
2939
2940                 s_vChangeAntenna(pDevice);
2941         pDevice->TimerSQ3Tmax3.expires =  RUN_AT(pDevice->byTMax3 * HZ);
2942         pDevice->TimerSQ3Tmax2.expires =  RUN_AT(pDevice->byTMax2 * HZ);
2943         add_timer(&pDevice->TimerSQ3Tmax3);
2944         add_timer(&pDevice->TimerSQ3Tmax2);
2945     } else {
2946         pDevice->ulRatio_State1 = s_ulGetRatio(pDevice);
2947         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"SQ3_State1, rate0 = %08x,rate1 = %08x\n",
2948                       (int)pDevice->ulRatio_State0,(int)pDevice->ulRatio_State1);
2949
2950         if ( pDevice->ulRatio_State1 < pDevice->ulRatio_State0 ) {
2951             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2.[%08x][%08x], uNumSQ3[%d]=%d, %d\n",
2952                           (int)pDevice->ulRatio_State0, (int)pDevice->ulRatio_State1,
2953                           (int)pDevice->wAntDiversityMaxRate,
2954                           (int)pDevice->uNumSQ3[(int)pDevice->wAntDiversityMaxRate], (int)pDevice->uDiversityCnt);
2955 #ifdef  PLICE_DEBUG
2956                 //printk("TimerSQ3CallBack3:call s_vChangeAntenna\n");
2957 #endif
2958
2959                         s_vChangeAntenna(pDevice);
2960
2961             pDevice->TimerSQ3Tmax3.expires =  RUN_AT(pDevice->byTMax3 * HZ);
2962             pDevice->TimerSQ3Tmax2.expires =  RUN_AT(pDevice->byTMax2 * HZ);
2963             add_timer(&pDevice->TimerSQ3Tmax3);
2964             add_timer(&pDevice->TimerSQ3Tmax2);
2965         }
2966     }
2967     pDevice->byAntennaState = 0;
2968     BBvClearAntDivSQ3Value(pDevice);
2969     spin_unlock_irq(&pDevice->lock);
2970
2971     return;
2972 }
2973