Merge branch 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[deliverable/linux.git] / drivers / staging / vt6656 / 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: Jerry Chen
25 *
26 * Date: Jun. 5, 2002
27 *
28 * Functions:
29 * BBuGetFrameTime - Calculate data frame transmitting time
30 * BBvCalculateParameter - Calculate PhyLength, PhyService and Phy Signal parameter for baseband Tx
31 * BBbVT3184Init - VIA VT3184 baseband chip init code
32 *
33 * Revision History:
34 *
35 *
36 */
37
38 #include "tmacro.h"
39 #include "tether.h"
40 #include "mac.h"
41 #include "baseband.h"
42 #include "rf.h"
43 #include "usbpipe.h"
44 #include "datarate.h"
45
46 static u8 abyVT3184_AGC[] = {
47 0x00, //0
48 0x00, //1
49 0x02, //2
50 0x02, //3 //RobertYu:20060505, 0x04, //3
51 0x04, //4
52 0x04, //5 //RobertYu:20060505, 0x06, //5
53 0x06, //6
54 0x06, //7
55 0x08, //8
56 0x08, //9
57 0x0A, //A
58 0x0A, //B
59 0x0C, //C
60 0x0C, //D
61 0x0E, //E
62 0x0E, //F
63 0x10, //10
64 0x10, //11
65 0x12, //12
66 0x12, //13
67 0x14, //14
68 0x14, //15
69 0x16, //16
70 0x16, //17
71 0x18, //18
72 0x18, //19
73 0x1A, //1A
74 0x1A, //1B
75 0x1C, //1C
76 0x1C, //1D
77 0x1E, //1E
78 0x1E, //1F
79 0x20, //20
80 0x20, //21
81 0x22, //22
82 0x22, //23
83 0x24, //24
84 0x24, //25
85 0x26, //26
86 0x26, //27
87 0x28, //28
88 0x28, //29
89 0x2A, //2A
90 0x2A, //2B
91 0x2C, //2C
92 0x2C, //2D
93 0x2E, //2E
94 0x2E, //2F
95 0x30, //30
96 0x30, //31
97 0x32, //32
98 0x32, //33
99 0x34, //34
100 0x34, //35
101 0x36, //36
102 0x36, //37
103 0x38, //38
104 0x38, //39
105 0x3A, //3A
106 0x3A, //3B
107 0x3C, //3C
108 0x3C, //3D
109 0x3E, //3E
110 0x3E //3F
111 };
112
113 static u8 abyVT3184_AL2230[] = {
114 0x31,//00
115 0x00,
116 0x00,
117 0x00,
118 0x00,
119 0x80,
120 0x00,
121 0x00,
122 0x70,
123 0x45,//tx //0x64 for FPGA
124 0x2A,
125 0x76,
126 0x00,
127 0x00,
128 0x80,
129 0x00,
130 0x00,//10
131 0x00,
132 0x00,
133 0x00,
134 0x00,
135 0x00,
136 0x00,
137 0x00,
138 0x00,
139 0x00,
140 0x00,
141 0x8e, //RobertYu:20060522, //0x8d,
142 0x0a, //RobertYu:20060515, //0x09,
143 0x00,
144 0x00,
145 0x00,
146 0x00,//20
147 0x00,
148 0x00,
149 0x00,
150 0x00,
151 0x4a,
152 0x00,
153 0x00,
154 0x00,
155 0x00,
156 0x00,
157 0x00,
158 0x00,
159 0x4a,
160 0x00,
161 0x0c, //RobertYu:20060522, //0x10,
162 0x26,//30
163 0x5b,
164 0x00,
165 0x00,
166 0x00,
167 0x00,
168 0xaa,
169 0xaa,
170 0xff,
171 0xff,
172 0x79,
173 0x00,
174 0x00,
175 0x0b,
176 0x48,
177 0x04,
178 0x00,//40
179 0x08,
180 0x00,
181 0x08,
182 0x08,
183 0x14,
184 0x05,
185 0x09,
186 0x00,
187 0x00,
188 0x00,
189 0x00,
190 0x09,
191 0x73,
192 0x00,
193 0xc5,
194 0x00,//50 //RobertYu:20060505, //0x15,//50
195 0x19,
196 0x00,
197 0x00,
198 0x00,
199 0x00,
200 0x00,
201 0x00,
202 0x00,
203 0xd0, //RobertYu:20060505, //0xb0,
204 0x00,
205 0x00,
206 0x00,
207 0x00,
208 0x00,
209 0x00,
210 0xe4,//60
211 0x80,
212 0x00,
213 0x00,
214 0x00,
215 0x00,
216 0x98,
217 0x0a,
218 0x00,
219 0x00,
220 0x00,
221 0x00,
222 0x00, //0x80 for FPGA
223 0x03,
224 0x01,
225 0x00,
226 0x00,//70
227 0x00,
228 0x00,
229 0x00,
230 0x00,
231 0x00,
232 0x00,
233 0x00,
234 0x00,
235 0x00,
236 0x00,
237 0x00,
238 0x00,
239 0x00,
240 0x00,
241 0x00,
242 0x8c,//80
243 0x01,
244 0x09,
245 0x00,
246 0x00,
247 0x00,
248 0x00,
249 0x00,
250 0x08,
251 0x00,
252 0x1f, //RobertYu:20060516, //0x0f,
253 0xb7,
254 0x88,
255 0x47,
256 0xaa,
257 0x00, //RobertYu:20060505, //0x02,
258 0x20,//90 //RobertYu:20060505, //0x22,//90
259 0x00,
260 0x00,
261 0x00,
262 0x00,
263 0x00,
264 0x00,
265 0xeb,
266 0x00,
267 0x00,
268 0x00,
269 0x00,
270 0x00,
271 0x00,
272 0x00,
273 0x01,
274 0x00,//a0
275 0x00,
276 0x00,
277 0x00,
278 0x00,
279 0x00,
280 0x10,
281 0x00,
282 0x18,
283 0x00,
284 0x00,
285 0x00,
286 0x00,
287 0x15, //RobertYu:20060516, //0x00,
288 0x00,
289 0x18,
290 0x38,//b0
291 0x30,
292 0x00,
293 0x00,
294 0xff,
295 0x0f,
296 0xe4,
297 0xe2,
298 0x00,
299 0x00,
300 0x00,
301 0x03,
302 0x01,
303 0x00,
304 0x00,
305 0x00,
306 0x18,//c0
307 0x20,
308 0x07,
309 0x18,
310 0xff,
311 0xff, //RobertYu:20060509, //0x2c,
312 0x0e, //RobertYu:20060530, //0x0c,
313 0x0a,
314 0x0e,
315 0x00, //RobertYu:20060505, //0x01,
316 0x82, //RobertYu:20060516, //0x8f,
317 0xa7,
318 0x3c,
319 0x10,
320 0x30, //RobertYu:20060627, //0x0b,
321 0x05, //RobertYu:20060516, //0x25,
322 0x40,//d0
323 0x12,
324 0x00,
325 0x00,
326 0x10,
327 0x28,
328 0x80,
329 0x2A,
330 0x00,
331 0x00,
332 0x00,
333 0x00,
334 0x00,
335 0x00,
336 0x00,
337 0x00,
338 0x00,//e0
339 0xf3, //RobertYu:20060516, //0xd3,
340 0x00,
341 0x00,
342 0x00,
343 0x10,
344 0x00,
345 0x12, //RobertYu:20060627, //0x10,
346 0x00,
347 0xf4,
348 0x00,
349 0xff,
350 0x79,
351 0x20,
352 0x30,
353 0x05, //RobertYu:20060516, //0x0c,
354 0x00,//f0
355 0x3e,
356 0x00,
357 0x00,
358 0x00,
359 0x00,
360 0x00,
361 0x00,
362 0x00,
363 0x00,
364 0x00,
365 0x00,
366 0x00,
367 0x00,
368 0x00,
369 0x00
370 };
371
372 //{{RobertYu:20060515, new BB setting for VT3226D0
373 static u8 abyVT3184_VT3226D0[] = {
374 0x31,//00
375 0x00,
376 0x00,
377 0x00,
378 0x00,
379 0x80,
380 0x00,
381 0x00,
382 0x70,
383 0x45,//tx //0x64 for FPGA
384 0x2A,
385 0x76,
386 0x00,
387 0x00,
388 0x80,
389 0x00,
390 0x00,//10
391 0x00,
392 0x00,
393 0x00,
394 0x00,
395 0x00,
396 0x00,
397 0x00,
398 0x00,
399 0x00,
400 0x00,
401 0x8e, //RobertYu:20060525, //0x8d,
402 0x0a, //RobertYu:20060515, //0x09,
403 0x00,
404 0x00,
405 0x00,
406 0x00,//20
407 0x00,
408 0x00,
409 0x00,
410 0x00,
411 0x4a,
412 0x00,
413 0x00,
414 0x00,
415 0x00,
416 0x00,
417 0x00,
418 0x00,
419 0x4a,
420 0x00,
421 0x0c, //RobertYu:20060525, //0x10,
422 0x26,//30
423 0x5b,
424 0x00,
425 0x00,
426 0x00,
427 0x00,
428 0xaa,
429 0xaa,
430 0xff,
431 0xff,
432 0x79,
433 0x00,
434 0x00,
435 0x0b,
436 0x48,
437 0x04,
438 0x00,//40
439 0x08,
440 0x00,
441 0x08,
442 0x08,
443 0x14,
444 0x05,
445 0x09,
446 0x00,
447 0x00,
448 0x00,
449 0x00,
450 0x09,
451 0x73,
452 0x00,
453 0xc5,
454 0x00,//50 //RobertYu:20060505, //0x15,//50
455 0x19,
456 0x00,
457 0x00,
458 0x00,
459 0x00,
460 0x00,
461 0x00,
462 0x00,
463 0xd0, //RobertYu:20060505, //0xb0,
464 0x00,
465 0x00,
466 0x00,
467 0x00,
468 0x00,
469 0x00,
470 0xe4,//60
471 0x80,
472 0x00,
473 0x00,
474 0x00,
475 0x00,
476 0x98,
477 0x0a,
478 0x00,
479 0x00,
480 0x00,
481 0x00,
482 0x00, //0x80 for FPGA
483 0x03,
484 0x01,
485 0x00,
486 0x00,//70
487 0x00,
488 0x00,
489 0x00,
490 0x00,
491 0x00,
492 0x00,
493 0x00,
494 0x00,
495 0x00,
496 0x00,
497 0x00,
498 0x00,
499 0x00,
500 0x00,
501 0x00,
502 0x8c,//80
503 0x01,
504 0x09,
505 0x00,
506 0x00,
507 0x00,
508 0x00,
509 0x00,
510 0x08,
511 0x00,
512 0x1f, //RobertYu:20060515, //0x0f,
513 0xb7,
514 0x88,
515 0x47,
516 0xaa,
517 0x00, //RobertYu:20060505, //0x02,
518 0x20,//90 //RobertYu:20060505, //0x22,//90
519 0x00,
520 0x00,
521 0x00,
522 0x00,
523 0x00,
524 0x00,
525 0xeb,
526 0x00,
527 0x00,
528 0x00,
529 0x00,
530 0x00,
531 0x00,
532 0x00,
533 0x01,
534 0x00,//a0
535 0x00,
536 0x00,
537 0x00,
538 0x00,
539 0x00,
540 0x10,
541 0x00,
542 0x18,
543 0x00,
544 0x00,
545 0x00,
546 0x00,
547 0x00,
548 0x00,
549 0x18,
550 0x38,//b0
551 0x30,
552 0x00,
553 0x00,
554 0xff,
555 0x0f,
556 0xe4,
557 0xe2,
558 0x00,
559 0x00,
560 0x00,
561 0x03,
562 0x01,
563 0x00,
564 0x00,
565 0x00,
566 0x18,//c0
567 0x20,
568 0x07,
569 0x18,
570 0xff,
571 0xff, //RobertYu:20060509, //0x2c,
572 0x10, //RobertYu:20060525, //0x0c,
573 0x0a,
574 0x0e,
575 0x00, //RobertYu:20060505, //0x01,
576 0x84, //RobertYu:20060525, //0x8f,
577 0xa7,
578 0x3c,
579 0x10,
580 0x24, //RobertYu:20060627, //0x18,
581 0x05, //RobertYu:20060515, //0x25,
582 0x40,//d0
583 0x12,
584 0x00,
585 0x00,
586 0x10,
587 0x28,
588 0x80,
589 0x2A,
590 0x00,
591 0x00,
592 0x00,
593 0x00,
594 0x00,
595 0x00,
596 0x00,
597 0x00,
598 0x00,//e0
599 0xf3, //RobertYu:20060515, //0xd3,
600 0x00,
601 0x00,
602 0x00,
603 0x10,
604 0x00,
605 0x10, //RobertYu:20060627, //0x0e,
606 0x00,
607 0xf4,
608 0x00,
609 0xff,
610 0x79,
611 0x20,
612 0x30,
613 0x08, //RobertYu:20060515, //0x0c,
614 0x00,//f0
615 0x3e,
616 0x00,
617 0x00,
618 0x00,
619 0x00,
620 0x00,
621 0x00,
622 0x00,
623 0x00,
624 0x00,
625 0x00,
626 0x00,
627 0x00,
628 0x00,
629 0x00,
630 };
631
632 static const u16 awcFrameTime[MAX_RATE] =
633 {10, 20, 55, 110, 24, 36, 48, 72, 96, 144, 192, 216};
634
635 /*
636 * Description: Calculate data frame transmitting time
637 *
638 * Parameters:
639 * In:
640 * preamble_type - Preamble Type
641 * pkt_type - PK_TYPE_11A, PK_TYPE_11B, PK_TYPE_11GB, PK_TYPE_11GA
642 * frame_length - Baseband Type
643 * tx_rate - Tx Rate
644 * Out:
645 *
646 * Return Value: FrameTime
647 *
648 */
649 unsigned int BBuGetFrameTime(u8 preamble_type, u8 pkt_type,
650 unsigned int frame_length, u16 tx_rate)
651 {
652 unsigned int frame_time;
653 unsigned int preamble;
654 unsigned int tmp;
655 unsigned int rate = 0;
656
657 if (tx_rate > RATE_54M)
658 return 0;
659
660 rate = (unsigned int)awcFrameTime[tx_rate];
661
662 if (tx_rate <= 3) {
663 if (preamble_type == 1)
664 preamble = 96;
665 else
666 preamble = 192;
667
668 frame_time = (frame_length * 80) / rate;
669 tmp = (frame_time * rate) / 80;
670
671 if (frame_length != tmp)
672 frame_time++;
673
674 return preamble + frame_time;
675 } else {
676 frame_time = (frame_length * 8 + 22) / rate;
677 tmp = ((frame_time * rate) - 22) / 8;
678
679 if (frame_length != tmp)
680 frame_time++;
681
682 frame_time = frame_time * 4;
683
684 if (pkt_type != PK_TYPE_11A)
685 frame_time += 6;
686
687 return 20 + frame_time;
688 }
689 }
690
691 /*
692 * Description: Calculate Length, Service, and Signal fields of Phy for Tx
693 *
694 * Parameters:
695 * In:
696 * priv - Device Structure
697 * frame_length - Tx Frame Length
698 * tx_rate - Tx Rate
699 * Out:
700 * struct vnt_phy_field *phy
701 * - pointer to Phy Length field
702 * - pointer to Phy Service field
703 * - pointer to Phy Signal field
704 *
705 * Return Value: none
706 *
707 */
708 void BBvCalculateParameter(struct vnt_private *priv, u32 frame_length,
709 u16 tx_rate, u8 pkt_type, struct vnt_phy_field *phy)
710 {
711 u32 bit_count;
712 u32 count = 0;
713 u32 tmp;
714 int ext_bit;
715 u8 preamble_type = priv->byPreambleType;
716
717 bit_count = frame_length * 8;
718 ext_bit = false;
719
720 switch (tx_rate) {
721 case RATE_1M:
722 count = bit_count;
723
724 phy->signal = 0x00;
725
726 break;
727 case RATE_2M:
728 count = bit_count / 2;
729
730 if (preamble_type == 1)
731 phy->signal = 0x09;
732 else
733 phy->signal = 0x01;
734
735 break;
736 case RATE_5M:
737 count = (bit_count * 10) / 55;
738 tmp = (count * 55) / 10;
739
740 if (tmp != bit_count)
741 count++;
742
743 if (preamble_type == 1)
744 phy->signal = 0x0a;
745 else
746 phy->signal = 0x02;
747
748 break;
749 case RATE_11M:
750 count = bit_count / 11;
751 tmp = count * 11;
752
753 if (tmp != bit_count) {
754 count++;
755
756 if ((bit_count - tmp) <= 3)
757 ext_bit = true;
758 }
759
760 if (preamble_type == 1)
761 phy->signal = 0x0b;
762 else
763 phy->signal = 0x03;
764
765 break;
766 case RATE_6M:
767 if (pkt_type == PK_TYPE_11A)
768 phy->signal = 0x9b;
769 else
770 phy->signal = 0x8b;
771
772 break;
773 case RATE_9M:
774 if (pkt_type == PK_TYPE_11A)
775 phy->signal = 0x9f;
776 else
777 phy->signal = 0x8f;
778
779 break;
780 case RATE_12M:
781 if (pkt_type == PK_TYPE_11A)
782 phy->signal = 0x9a;
783 else
784 phy->signal = 0x8a;
785
786 break;
787 case RATE_18M:
788 if (pkt_type == PK_TYPE_11A)
789 phy->signal = 0x9e;
790 else
791 phy->signal = 0x8e;
792
793 break;
794 case RATE_24M:
795 if (pkt_type == PK_TYPE_11A)
796 phy->signal = 0x99;
797 else
798 phy->signal = 0x89;
799
800 break;
801 case RATE_36M:
802 if (pkt_type == PK_TYPE_11A)
803 phy->signal = 0x9d;
804 else
805 phy->signal = 0x8d;
806
807 break;
808 case RATE_48M:
809 if (pkt_type == PK_TYPE_11A)
810 phy->signal = 0x98;
811 else
812 phy->signal = 0x88;
813
814 break;
815 case RATE_54M:
816 if (pkt_type == PK_TYPE_11A)
817 phy->signal = 0x9c;
818 else
819 phy->signal = 0x8c;
820 break;
821 default:
822 if (pkt_type == PK_TYPE_11A)
823 phy->signal = 0x9c;
824 else
825 phy->signal = 0x8c;
826 break;
827 }
828
829 if (pkt_type == PK_TYPE_11B) {
830 phy->service = 0x00;
831 if (ext_bit)
832 phy->service |= 0x80;
833 phy->len = cpu_to_le16((u16)count);
834 } else {
835 phy->service = 0x00;
836 phy->len = cpu_to_le16((u16)frame_length);
837 }
838 }
839
840 /*
841 * Description: Set Antenna mode
842 *
843 * Parameters:
844 * In:
845 * priv - Device Structure
846 * antenna_mode - Antenna Mode
847 * Out:
848 * none
849 *
850 * Return Value: none
851 *
852 */
853 void BBvSetAntennaMode(struct vnt_private *priv, u8 antenna_mode)
854 {
855 switch (antenna_mode) {
856 case ANT_TXA:
857 case ANT_TXB:
858 break;
859 case ANT_RXA:
860 priv->byBBRxConf &= 0xFC;
861 break;
862 case ANT_RXB:
863 priv->byBBRxConf &= 0xFE;
864 priv->byBBRxConf |= 0x02;
865 break;
866 }
867
868 vnt_control_out(priv, MESSAGE_TYPE_SET_ANTMD,
869 (u16)antenna_mode, 0, 0, NULL);
870 }
871
872 /*
873 * Description: Set Antenna mode
874 *
875 * Parameters:
876 * In:
877 * pDevice - Device Structure
878 * byAntennaMode - Antenna Mode
879 * Out:
880 * none
881 *
882 * Return Value: none
883 *
884 */
885
886 int BBbVT3184Init(struct vnt_private *priv)
887 {
888 int status;
889 u16 length;
890 u8 *addr;
891 u8 *agc;
892 u16 length_agc;
893 u8 array[256];
894 u8 data;
895
896 status = vnt_control_in(priv, MESSAGE_TYPE_READ, 0,
897 MESSAGE_REQUEST_EEPROM, EEP_MAX_CONTEXT_SIZE,
898 priv->abyEEPROM);
899 if (status != STATUS_SUCCESS)
900 return false;
901
902 /* zonetype initial */
903 priv->byOriginalZonetype = priv->abyEEPROM[EEP_OFS_ZONETYPE];
904
905 if (priv->config_file.ZoneType >= 0) {
906 if ((priv->config_file.ZoneType == 0) &&
907 (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x00)) {
908 priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0;
909 priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B;
910
911 dev_dbg(&priv->usb->dev, "Init Zone Type :USA\n");
912 } else if ((priv->config_file.ZoneType == 1) &&
913 (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x01)) {
914 priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01;
915 priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
916
917 dev_dbg(&priv->usb->dev, "Init Zone Type :Japan\n");
918 } else if ((priv->config_file.ZoneType == 2) &&
919 (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x02)) {
920 priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02;
921 priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
922
923 dev_dbg(&priv->usb->dev, "Init Zone Type :Europe\n");
924 } else {
925 if (priv->config_file.ZoneType !=
926 priv->abyEEPROM[EEP_OFS_ZONETYPE])
927 printk("zonetype in file[%02x]\
928 mismatch with in EEPROM[%02x]\n",
929 priv->config_file.ZoneType,
930 priv->abyEEPROM[EEP_OFS_ZONETYPE]);
931 else
932 printk("Read Zonetype file success,\
933 use default zonetype setting[%02x]\n",
934 priv->config_file.ZoneType);
935 }
936 }
937
938 if (!priv->bZoneRegExist)
939 priv->byZoneType = priv->abyEEPROM[EEP_OFS_ZONETYPE];
940
941 priv->byRFType = priv->abyEEPROM[EEP_OFS_RFTYPE];
942
943 dev_dbg(&priv->usb->dev, "Zone Type %x\n", priv->byZoneType);
944
945 dev_dbg(&priv->usb->dev, "RF Type %d\n", priv->byRFType);
946
947 if ((priv->byRFType == RF_AL2230) ||
948 (priv->byRFType == RF_AL2230S)) {
949 priv->byBBRxConf = abyVT3184_AL2230[10];
950 length = sizeof(abyVT3184_AL2230);
951 addr = abyVT3184_AL2230;
952 agc = abyVT3184_AGC;
953 length_agc = sizeof(abyVT3184_AGC);
954
955 priv->abyBBVGA[0] = 0x1C;
956 priv->abyBBVGA[1] = 0x10;
957 priv->abyBBVGA[2] = 0x0;
958 priv->abyBBVGA[3] = 0x0;
959 priv->ldBmThreshold[0] = -70;
960 priv->ldBmThreshold[1] = -48;
961 priv->ldBmThreshold[2] = 0;
962 priv->ldBmThreshold[3] = 0;
963 } else if (priv->byRFType == RF_AIROHA7230) {
964 priv->byBBRxConf = abyVT3184_AL2230[10];
965 length = sizeof(abyVT3184_AL2230);
966 addr = abyVT3184_AL2230;
967 agc = abyVT3184_AGC;
968 length_agc = sizeof(abyVT3184_AGC);
969
970 addr[0xd7] = 0x06;
971
972 priv->abyBBVGA[0] = 0x1c;
973 priv->abyBBVGA[1] = 0x10;
974 priv->abyBBVGA[2] = 0x0;
975 priv->abyBBVGA[3] = 0x0;
976 priv->ldBmThreshold[0] = -70;
977 priv->ldBmThreshold[1] = -48;
978 priv->ldBmThreshold[2] = 0;
979 priv->ldBmThreshold[3] = 0;
980 } else if ((priv->byRFType == RF_VT3226) ||
981 (priv->byRFType == RF_VT3226D0)) {
982 priv->byBBRxConf = abyVT3184_VT3226D0[10];
983 length = sizeof(abyVT3184_VT3226D0);
984 addr = abyVT3184_VT3226D0;
985 agc = abyVT3184_AGC;
986 length_agc = sizeof(abyVT3184_AGC);
987
988 priv->abyBBVGA[0] = 0x20;
989 priv->abyBBVGA[1] = 0x10;
990 priv->abyBBVGA[2] = 0x0;
991 priv->abyBBVGA[3] = 0x0;
992 priv->ldBmThreshold[0] = -70;
993 priv->ldBmThreshold[1] = -48;
994 priv->ldBmThreshold[2] = 0;
995 priv->ldBmThreshold[3] = 0;
996 /* Fix VT3226 DFC system timing issue */
997 MACvRegBitsOn(priv, MAC_REG_SOFTPWRCTL2, SOFTPWRCTL_RFLEOPT);
998 } else if ((priv->byRFType == RF_VT3342A0)) {
999 priv->byBBRxConf = abyVT3184_VT3226D0[10];
1000 length = sizeof(abyVT3184_VT3226D0);
1001 addr = abyVT3184_VT3226D0;
1002 agc = abyVT3184_AGC;
1003 length_agc = sizeof(abyVT3184_AGC);
1004
1005 priv->abyBBVGA[0] = 0x20;
1006 priv->abyBBVGA[1] = 0x10;
1007 priv->abyBBVGA[2] = 0x0;
1008 priv->abyBBVGA[3] = 0x0;
1009 priv->ldBmThreshold[0] = -70;
1010 priv->ldBmThreshold[1] = -48;
1011 priv->ldBmThreshold[2] = 0;
1012 priv->ldBmThreshold[3] = 0;
1013 /* Fix VT3226 DFC system timing issue */
1014 MACvRegBitsOn(priv, MAC_REG_SOFTPWRCTL2, SOFTPWRCTL_RFLEOPT);
1015 } else {
1016 return true;
1017 }
1018
1019 memcpy(array, addr, length);
1020
1021 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
1022 MESSAGE_REQUEST_BBREG, length, array);
1023
1024 memcpy(array, agc, length_agc);
1025
1026 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
1027 MESSAGE_REQUEST_BBAGC, length_agc, array);
1028
1029 if ((priv->byRFType == RF_VT3226) ||
1030 (priv->byRFType == RF_VT3342A0)) {
1031 vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
1032 MAC_REG_ITRTMSET, 0x23);
1033 MACvRegBitsOn(priv, MAC_REG_PAPEDELAY, 0x01);
1034 } else if (priv->byRFType == RF_VT3226D0) {
1035 vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
1036 MAC_REG_ITRTMSET, 0x11);
1037 MACvRegBitsOn(priv, MAC_REG_PAPEDELAY, 0x01);
1038 }
1039
1040 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x04, 0x7f);
1041 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);
1042
1043 vnt_rf_table_download(priv);
1044
1045 /* Fix for TX USB resets from vendors driver */
1046 vnt_control_in(priv, MESSAGE_TYPE_READ, USB_REG4,
1047 MESSAGE_REQUEST_MEM, sizeof(data), &data);
1048
1049 data |= 0x2;
1050
1051 vnt_control_out(priv, MESSAGE_TYPE_WRITE, USB_REG4,
1052 MESSAGE_REQUEST_MEM, sizeof(data), &data);
1053
1054 return true;
1055 }
1056
1057 /*
1058 * Description: Set ShortSlotTime mode
1059 *
1060 * Parameters:
1061 * In:
1062 * priv - Device Structure
1063 * Out:
1064 * none
1065 *
1066 * Return Value: none
1067 *
1068 */
1069 void BBvSetShortSlotTime(struct vnt_private *priv)
1070 {
1071 u8 bb_vga = 0;
1072
1073 if (priv->bShortSlotTime)
1074 priv->byBBRxConf &= 0xdf;
1075 else
1076 priv->byBBRxConf |= 0x20;
1077
1078 vnt_control_in_u8(priv, MESSAGE_REQUEST_BBREG, 0xe7, &bb_vga);
1079
1080 if (bb_vga == priv->abyBBVGA[0])
1081 priv->byBBRxConf |= 0x20;
1082
1083 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->byBBRxConf);
1084 }
1085
1086 void BBvSetVGAGainOffset(struct vnt_private *priv, u8 data)
1087 {
1088
1089 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xE7, data);
1090
1091 /* patch for 3253B0 Baseband with Cardbus module */
1092 if (priv->bShortSlotTime)
1093 priv->byBBRxConf &= 0xdf; /* 1101 1111 */
1094 else
1095 priv->byBBRxConf |= 0x20; /* 0010 0000 */
1096
1097 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->byBBRxConf);
1098 }
1099
1100 /*
1101 * Description: BBvSetDeepSleep
1102 *
1103 * Parameters:
1104 * In:
1105 * priv - Device Structure
1106 * Out:
1107 * none
1108 *
1109 * Return Value: none
1110 *
1111 */
1112 void BBvSetDeepSleep(struct vnt_private *priv)
1113 {
1114 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);/* CR12 */
1115 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0xB9);/* CR13 */
1116 }
1117
1118 void BBvExitDeepSleep(struct vnt_private *priv)
1119 {
1120 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);/* CR12 */
1121 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);/* CR13 */
1122 }
1123
1124 void BBvUpdatePreEDThreshold(struct vnt_private *priv, int scanning)
1125 {
1126 u8 cr_201 = 0x0, cr_206 = 0x0;
1127 u8 ed_inx = priv->byBBPreEDIndex;
1128
1129 switch (priv->byRFType) {
1130 case RF_AL2230:
1131 case RF_AL2230S:
1132 case RF_AIROHA7230:
1133 if (scanning) { /* Max sensitivity */
1134 ed_inx = 0;
1135 cr_206 = 0x30;
1136 break;
1137 }
1138
1139 if (priv->byBBPreEDRSSI <= 45) {
1140 ed_inx = 20;
1141 cr_201 = 0xff;
1142 } else if (priv->byBBPreEDRSSI <= 46) {
1143 ed_inx = 19;
1144 cr_201 = 0x1a;
1145 } else if (priv->byBBPreEDRSSI <= 47) {
1146 ed_inx = 18;
1147 cr_201 = 0x15;
1148 } else if (priv->byBBPreEDRSSI <= 49) {
1149 ed_inx = 17;
1150 cr_201 = 0xe;
1151 } else if (priv->byBBPreEDRSSI <= 51) {
1152 ed_inx = 16;
1153 cr_201 = 0x9;
1154 } else if (priv->byBBPreEDRSSI <= 53) {
1155 ed_inx = 15;
1156 cr_201 = 0x6;
1157 } else if (priv->byBBPreEDRSSI <= 55) {
1158 ed_inx = 14;
1159 cr_201 = 0x3;
1160 } else if (priv->byBBPreEDRSSI <= 56) {
1161 ed_inx = 13;
1162 cr_201 = 0x2;
1163 cr_206 = 0xa0;
1164 } else if (priv->byBBPreEDRSSI <= 57) {
1165 ed_inx = 12;
1166 cr_201 = 0x2;
1167 cr_206 = 0x20;
1168 } else if (priv->byBBPreEDRSSI <= 58) {
1169 ed_inx = 11;
1170 cr_201 = 0x1;
1171 cr_206 = 0xa0;
1172 } else if (priv->byBBPreEDRSSI <= 59) {
1173 ed_inx = 10;
1174 cr_201 = 0x1;
1175 cr_206 = 0x54;
1176 } else if (priv->byBBPreEDRSSI <= 60) {
1177 ed_inx = 9;
1178 cr_201 = 0x1;
1179 cr_206 = 0x18;
1180 } else if (priv->byBBPreEDRSSI <= 61) {
1181 ed_inx = 8;
1182 cr_206 = 0xe3;
1183 } else if (priv->byBBPreEDRSSI <= 62) {
1184 ed_inx = 7;
1185 cr_206 = 0xb9;
1186 } else if (priv->byBBPreEDRSSI <= 63) {
1187 ed_inx = 6;
1188 cr_206 = 0x93;
1189 } else if (priv->byBBPreEDRSSI <= 64) {
1190 ed_inx = 5;
1191 cr_206 = 0x79;
1192 } else if (priv->byBBPreEDRSSI <= 65) {
1193 ed_inx = 4;
1194 cr_206 = 0x62;
1195 } else if (priv->byBBPreEDRSSI <= 66) {
1196 ed_inx = 3;
1197 cr_206 = 0x51;
1198 } else if (priv->byBBPreEDRSSI <= 67) {
1199 ed_inx = 2;
1200 cr_206 = 0x43;
1201 } else if (priv->byBBPreEDRSSI <= 68) {
1202 ed_inx = 1;
1203 cr_206 = 0x36;
1204 } else {
1205 ed_inx = 0;
1206 cr_206 = 0x30;
1207 }
1208 break;
1209
1210 case RF_VT3226:
1211 case RF_VT3226D0:
1212 if (scanning) { /* Max sensitivity */
1213 ed_inx = 0;
1214 cr_206 = 0x24;
1215 break;
1216 }
1217
1218 if (priv->byBBPreEDRSSI <= 41) {
1219 ed_inx = 22;
1220 cr_201 = 0xff;
1221 } else if (priv->byBBPreEDRSSI <= 42) {
1222 ed_inx = 21;
1223 cr_201 = 0x36;
1224 } else if (priv->byBBPreEDRSSI <= 43) {
1225 ed_inx = 20;
1226 cr_201 = 0x26;
1227 } else if (priv->byBBPreEDRSSI <= 45) {
1228 ed_inx = 19;
1229 cr_201 = 0x18;
1230 } else if (priv->byBBPreEDRSSI <= 47) {
1231 ed_inx = 18;
1232 cr_201 = 0x11;
1233 } else if (priv->byBBPreEDRSSI <= 49) {
1234 ed_inx = 17;
1235 cr_201 = 0xa;
1236 } else if (priv->byBBPreEDRSSI <= 51) {
1237 ed_inx = 16;
1238 cr_201 = 0x7;
1239 } else if (priv->byBBPreEDRSSI <= 53) {
1240 ed_inx = 15;
1241 cr_201 = 0x4;
1242 } else if (priv->byBBPreEDRSSI <= 55) {
1243 ed_inx = 14;
1244 cr_201 = 0x2;
1245 cr_206 = 0xc0;
1246 } else if (priv->byBBPreEDRSSI <= 56) {
1247 ed_inx = 13;
1248 cr_201 = 0x2;
1249 cr_206 = 0x30;
1250 } else if (priv->byBBPreEDRSSI <= 57) {
1251 ed_inx = 12;
1252 cr_201 = 0x1;
1253 cr_206 = 0xb0;
1254 } else if (priv->byBBPreEDRSSI <= 58) {
1255 ed_inx = 11;
1256 cr_201 = 0x1;
1257 cr_206 = 0x70;
1258 } else if (priv->byBBPreEDRSSI <= 59) {
1259 ed_inx = 10;
1260 cr_201 = 0x1;
1261 cr_206 = 0x30;
1262 } else if (priv->byBBPreEDRSSI <= 60) {
1263 ed_inx = 9;
1264 cr_206 = 0xea;
1265 } else if (priv->byBBPreEDRSSI <= 61) {
1266 ed_inx = 8;
1267 cr_206 = 0xc0;
1268 } else if (priv->byBBPreEDRSSI <= 62) {
1269 ed_inx = 7;
1270 cr_206 = 0x9c;
1271 } else if (priv->byBBPreEDRSSI <= 63) {
1272 ed_inx = 6;
1273 cr_206 = 0x80;
1274 } else if (priv->byBBPreEDRSSI <= 64) {
1275 ed_inx = 5;
1276 cr_206 = 0x68;
1277 } else if (priv->byBBPreEDRSSI <= 65) {
1278 ed_inx = 4;
1279 cr_206 = 0x52;
1280 } else if (priv->byBBPreEDRSSI <= 66) {
1281 ed_inx = 3;
1282 cr_206 = 0x43;
1283 } else if (priv->byBBPreEDRSSI <= 67) {
1284 ed_inx = 2;
1285 cr_206 = 0x36;
1286 } else if (priv->byBBPreEDRSSI <= 68) {
1287 ed_inx = 1;
1288 cr_206 = 0x2d;
1289 } else {
1290 ed_inx = 0;
1291 cr_206 = 0x24;
1292 }
1293 break;
1294
1295 case RF_VT3342A0:
1296 if (scanning) { /* need Max sensitivity */
1297 ed_inx = 0;
1298 cr_206 = 0x38;
1299 break;
1300 }
1301
1302 if (priv->byBBPreEDRSSI <= 41) {
1303 ed_inx = 20;
1304 cr_201 = 0xff;
1305 } else if (priv->byBBPreEDRSSI <= 42) {
1306 ed_inx = 19;
1307 cr_201 = 0x36;
1308 } else if (priv->byBBPreEDRSSI <= 43) {
1309 ed_inx = 18;
1310 cr_201 = 0x26;
1311 } else if (priv->byBBPreEDRSSI <= 45) {
1312 ed_inx = 17;
1313 cr_201 = 0x18;
1314 } else if (priv->byBBPreEDRSSI <= 47) {
1315 ed_inx = 16;
1316 cr_201 = 0x11;
1317 } else if (priv->byBBPreEDRSSI <= 49) {
1318 ed_inx = 15;
1319 cr_201 = 0xa;
1320 } else if (priv->byBBPreEDRSSI <= 51) {
1321 ed_inx = 14;
1322 cr_201 = 0x7;
1323 } else if (priv->byBBPreEDRSSI <= 53) {
1324 ed_inx = 13;
1325 cr_201 = 0x4;
1326 } else if (priv->byBBPreEDRSSI <= 55) {
1327 ed_inx = 12;
1328 cr_201 = 0x2;
1329 cr_206 = 0xc0;
1330 } else if (priv->byBBPreEDRSSI <= 56) {
1331 ed_inx = 11;
1332 cr_201 = 0x2;
1333 cr_206 = 0x30;
1334 } else if (priv->byBBPreEDRSSI <= 57) {
1335 ed_inx = 10;
1336 cr_201 = 0x1;
1337 cr_206 = 0xb0;
1338 } else if (priv->byBBPreEDRSSI <= 58) {
1339 ed_inx = 9;
1340 cr_201 = 0x1;
1341 cr_206 = 0x70;
1342 } else if (priv->byBBPreEDRSSI <= 59) {
1343 ed_inx = 8;
1344 cr_201 = 0x1;
1345 cr_206 = 0x30;
1346 } else if (priv->byBBPreEDRSSI <= 60) {
1347 ed_inx = 7;
1348 cr_206 = 0xea;
1349 } else if (priv->byBBPreEDRSSI <= 61) {
1350 ed_inx = 6;
1351 cr_206 = 0xc0;
1352 } else if (priv->byBBPreEDRSSI <= 62) {
1353 ed_inx = 5;
1354 cr_206 = 0x9c;
1355 } else if (priv->byBBPreEDRSSI <= 63) {
1356 ed_inx = 4;
1357 cr_206 = 0x80;
1358 } else if (priv->byBBPreEDRSSI <= 64) {
1359 ed_inx = 3;
1360 cr_206 = 0x68;
1361 } else if (priv->byBBPreEDRSSI <= 65) {
1362 ed_inx = 2;
1363 cr_206 = 0x52;
1364 } else if (priv->byBBPreEDRSSI <= 66) {
1365 ed_inx = 1;
1366 cr_206 = 0x43;
1367 } else {
1368 ed_inx = 0;
1369 cr_206 = 0x38;
1370 }
1371 break;
1372
1373 }
1374
1375 if (ed_inx == priv->byBBPreEDIndex && !scanning)
1376 return;
1377
1378 priv->byBBPreEDIndex = ed_inx;
1379
1380 dev_dbg(&priv->usb->dev, "%s byBBPreEDRSSI %d\n",
1381 __func__, priv->byBBPreEDRSSI);
1382
1383 if (!cr_201 && !cr_206)
1384 return;
1385
1386 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xc9, cr_201);
1387 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xce, cr_206);
1388 }
1389
This page took 0.05859 seconds and 6 git commands to generate.