1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include "../rt_config.h"
29
30
31CH_FREQ_MAP CH_HZ_ID_MAP[]=
32 {
33 {1, 2412},
34 {2, 2417},
35 {3, 2422},
36 {4, 2427},
37 {5, 2432},
38 {6, 2437},
39 {7, 2442},
40 {8, 2447},
41 {9, 2452},
42 {10, 2457},
43 {11, 2462},
44 {12, 2467},
45 {13, 2472},
46 {14, 2484},
47
48
49 {36, 5180},
50 {40, 5200},
51 {44, 5220},
52 {48, 5240},
53 {52, 5260},
54 {56, 5280},
55 {60, 5300},
56 {64, 5320},
57 {149, 5745},
58 {153, 5765},
59 {157, 5785},
60 {161, 5805},
61 {165, 5825},
62 {167, 5835},
63 {169, 5845},
64 {171, 5855},
65 {173, 5865},
66
67
68 {100, 5500},
69 {104, 5520},
70 {108, 5540},
71 {112, 5560},
72 {116, 5580},
73 {120, 5600},
74 {124, 5620},
75 {128, 5640},
76 {132, 5660},
77 {136, 5680},
78 {140, 5700},
79
80
81 {34, 5170},
82 {38, 5190},
83 {42, 5210},
84 {46, 5230},
85
86
87 {184, 4920},
88 {188, 4940},
89 {192, 4960},
90 {196, 4980},
91
92 {208, 5040},
93 {212, 5060},
94 {216, 5080},
95};
96
97INT CH_HZ_ID_MAP_NUM = (sizeof(CH_HZ_ID_MAP)/sizeof(CH_FREQ_MAP));
98
99CH_REGION ChRegion[] =
100{
101 {
102 "AG",
103 CE,
104 {
105 { 1, 13, 20, BOTH, FALSE},
106 { 36, 4, 23, BOTH, FALSE},
107 { 52, 4, 23, BOTH, FALSE},
108 { 100, 11, 30, BOTH, FALSE},
109 { 0},
110 }
111 },
112
113 {
114 "AR",
115 CE,
116 {
117 { 1, 13, 20, BOTH, FALSE},
118 { 52, 4, 24, BOTH, FALSE},
119 { 149, 4, 30, BOTH, FALSE},
120 { 0},
121 }
122 },
123
124 {
125 "AW",
126 CE,
127 {
128 { 1, 13, 20, BOTH, FALSE},
129 { 36, 4, 23, BOTH, FALSE},
130 { 52, 4, 23, BOTH, FALSE},
131 { 100, 11, 30, BOTH, FALSE},
132 { 0},
133 }
134 },
135
136 {
137 "AU",
138 CE,
139 {
140 { 1, 13, 20, BOTH, FALSE},
141 { 36, 4, 23, BOTH, FALSE},
142 { 52, 4, 24, BOTH, FALSE},
143 { 149, 5, 30, BOTH, FALSE},
144 { 0},
145 }
146 },
147
148 {
149 "AT",
150 CE,
151 {
152 { 1, 13, 20, BOTH, FALSE},
153 { 36, 4, 23, IDOR, TRUE},
154 { 52, 4, 23, IDOR, TRUE},
155 { 100, 11, 30, BOTH, TRUE},
156 { 0},
157 }
158 },
159
160 {
161 "BS",
162 CE,
163 {
164 { 1, 13, 20, BOTH, FALSE},
165 { 36, 4, 23, BOTH, FALSE},
166 { 52, 4, 24, BOTH, FALSE},
167 { 149, 5, 30, BOTH, FALSE},
168 { 0},
169 }
170 },
171
172 {
173 "BB",
174 CE,
175 {
176 { 1, 13, 20, BOTH, FALSE},
177 { 36, 4, 23, BOTH, FALSE},
178 { 52, 4, 24, BOTH, FALSE},
179 { 100, 11, 30, BOTH, FALSE},
180 { 0},
181 }
182 },
183
184 {
185 "BM",
186 CE,
187 {
188 { 1, 13, 20, BOTH, FALSE},
189 { 36, 4, 23, BOTH, FALSE},
190 { 52, 4, 24, BOTH, FALSE},
191 { 100, 11, 30, BOTH, FALSE},
192 { 0},
193 }
194 },
195
196 {
197 "BR",
198 CE,
199 {
200 { 1, 13, 20, BOTH, FALSE},
201 { 36, 4, 23, BOTH, FALSE},
202 { 52, 4, 24, BOTH, FALSE},
203 { 100, 11, 24, BOTH, FALSE},
204 { 149, 5, 30, BOTH, FALSE},
205 { 0},
206 }
207 },
208
209 {
210 "BE",
211 CE,
212 {
213 { 1, 13, 20, BOTH, FALSE},
214 { 36, 4, 18, IDOR, FALSE},
215 { 52, 4, 18, IDOR, FALSE},
216 { 0},
217 }
218 },
219
220 {
221 "BG",
222 CE,
223 {
224 { 1, 13, 20, BOTH, FALSE},
225 { 36, 4, 23, IDOR, FALSE},
226 { 52, 4, 23, IDOR, TRUE},
227 { 100, 11, 30, ODOR, TRUE},
228 { 0},
229 }
230 },
231
232 {
233 "CA",
234 CE,
235 {
236 { 1, 13, 20, BOTH, FALSE},
237 { 36, 4, 23, BOTH, FALSE},
238 { 52, 4, 23, BOTH, FALSE},
239 { 149, 5, 30, BOTH, FALSE},
240 { 0},
241 }
242 },
243
244 {
245 "KY",
246 CE,
247 {
248 { 1, 13, 20, BOTH, FALSE},
249 { 36, 4, 23, BOTH, FALSE},
250 { 52, 4, 24, BOTH, FALSE},
251 { 100, 11, 30, BOTH, FALSE},
252 { 0},
253 }
254 },
255
256 {
257 "CL",
258 CE,
259 {
260 { 1, 13, 20, BOTH, FALSE},
261 { 36, 4, 20, BOTH, FALSE},
262 { 52, 4, 20, BOTH, FALSE},
263 { 149, 5, 20, BOTH, FALSE},
264 { 0},
265 }
266 },
267
268 {
269 "CN",
270 CE,
271 {
272 { 1, 13, 20, BOTH, FALSE},
273 { 149, 4, 27, BOTH, FALSE},
274 { 0},
275 }
276 },
277
278 {
279 "CO",
280 CE,
281 {
282 { 1, 13, 20, BOTH, FALSE},
283 { 36, 4, 17, BOTH, FALSE},
284 { 52, 4, 24, BOTH, FALSE},
285 { 100, 11, 30, BOTH, FALSE},
286 { 149, 5, 30, BOTH, FALSE},
287 { 0},
288 }
289 },
290
291 {
292 "CR",
293 CE,
294 {
295 { 1, 13, 20, BOTH, FALSE},
296 { 36, 4, 17, BOTH, FALSE},
297 { 52, 4, 24, BOTH, FALSE},
298 { 149, 4, 30, BOTH, FALSE},
299 { 0},
300 }
301 },
302
303 {
304 "CY",
305 CE,
306 {
307 { 1, 13, 20, BOTH, FALSE},
308 { 36, 4, 23, IDOR, FALSE},
309 { 52, 4, 24, IDOR, TRUE},
310 { 100, 11, 30, BOTH, TRUE},
311 { 0},
312 }
313 },
314
315 {
316 "CZ",
317 CE,
318 {
319 { 1, 13, 20, BOTH, FALSE},
320 { 36, 4, 23, IDOR, FALSE},
321 { 52, 4, 23, IDOR, TRUE},
322 { 0},
323 }
324 },
325
326 {
327 "DK",
328 CE,
329 {
330 { 1, 13, 20, BOTH, FALSE},
331 { 36, 4, 23, IDOR, FALSE},
332 { 52, 4, 23, IDOR, TRUE},
333 { 100, 11, 30, BOTH, TRUE},
334 { 0},
335 }
336 },
337
338 {
339 "DO",
340 CE,
341 {
342 { 1, 0, 20, BOTH, FALSE},
343 { 149, 4, 20, BOTH, FALSE},
344 { 0},
345 }
346 },
347
348 {
349 "EC",
350 CE,
351 {
352 { 1, 13, 20, BOTH, FALSE},
353 { 100, 11, 27, BOTH, FALSE},
354 { 0},
355 }
356 },
357
358 {
359 "SV",
360 CE,
361 {
362 { 1, 13, 20, BOTH, FALSE},
363 { 36, 4, 23, IDOR, FALSE},
364 { 52, 4, 30, BOTH, TRUE},
365 { 149, 4, 36, BOTH, TRUE},
366 { 0},
367 }
368 },
369
370 {
371 "FI",
372 CE,
373 {
374 { 1, 13, 20, BOTH, FALSE},
375 { 36, 4, 23, IDOR, FALSE},
376 { 52, 4, 23, IDOR, TRUE},
377 { 100, 11, 30, BOTH, TRUE},
378 { 0},
379 }
380 },
381
382 {
383 "FR",
384 CE,
385 {
386 { 1, 13, 20, BOTH, FALSE},
387 { 36, 4, 23, IDOR, FALSE},
388 { 52, 4, 23, IDOR, TRUE},
389 { 0},
390 }
391 },
392
393 {
394 "DE",
395 CE,
396 {
397 { 1, 13, 20, BOTH, FALSE},
398 { 36, 4, 23, IDOR, FALSE},
399 { 52, 4, 23, IDOR, TRUE},
400 { 100, 11, 30, BOTH, TRUE},
401 { 0},
402 }
403 },
404
405 {
406 "GR",
407 CE,
408 {
409 { 1, 13, 20, BOTH, FALSE},
410 { 36, 4, 23, IDOR, FALSE},
411 { 52, 4, 23, IDOR, TRUE},
412 { 100, 11, 30, ODOR, TRUE},
413 { 0},
414 }
415 },
416
417 {
418 "GU",
419 CE,
420 {
421 { 1, 11, 20, BOTH, FALSE},
422 { 36, 4, 17, BOTH, FALSE},
423 { 52, 4, 24, BOTH, FALSE},
424 { 100, 11, 30, BOTH, FALSE},
425 { 149, 5, 30, BOTH, FALSE},
426 { 0},
427 }
428 },
429
430 {
431 "GT",
432 CE,
433 {
434 { 1, 13, 20, BOTH, FALSE},
435 { 36, 4, 17, BOTH, FALSE},
436 { 52, 4, 24, BOTH, FALSE},
437 { 149, 4, 30, BOTH, FALSE},
438 { 0},
439 }
440 },
441
442 {
443 "HT",
444 CE,
445 {
446 { 1, 13, 20, BOTH, FALSE},
447 { 36, 4, 17, BOTH, FALSE},
448 { 52, 4, 24, BOTH, FALSE},
449 { 149, 4, 30, BOTH, FALSE},
450 { 0},
451 }
452 },
453
454 {
455 "HN",
456 CE,
457 {
458 { 1, 13, 20, BOTH, FALSE},
459 { 149, 4, 27, BOTH, FALSE},
460 { 0},
461 }
462 },
463
464 {
465 "HK",
466 CE,
467 {
468 { 1, 13, 20, BOTH, FALSE},
469 { 36, 4, 23, IDOR, FALSE},
470 { 52, 4, 23, IDOR, FALSE},
471 { 149, 4, 30, BOTH, FALSE},
472 { 0},
473 }
474 },
475
476 {
477 "HU",
478 CE,
479 {
480 { 1, 13, 20, BOTH, FALSE},
481 { 36, 4, 23, IDOR, FALSE},
482 { 52, 4, 23, IDOR, TRUE},
483 { 0},
484 }
485 },
486
487 {
488 "IS",
489 CE,
490 {
491 { 1, 13, 20, BOTH, FALSE},
492 { 36, 4, 23, IDOR, FALSE},
493 { 52, 4, 23, IDOR, TRUE},
494 { 100, 11, 30, BOTH, TRUE},
495 { 0},
496 }
497 },
498
499 {
500 "IN",
501 CE,
502 {
503 { 1, 13, 20, BOTH, FALSE},
504 { 149, 4, 24, IDOR, FALSE},
505 { 0},
506 }
507 },
508
509 {
510 "ID",
511 CE,
512 {
513 { 1, 13, 20, BOTH, FALSE},
514 { 149, 4, 27, BOTH, FALSE},
515 { 0},
516 }
517 },
518
519 {
520 "IE",
521 CE,
522 {
523 { 1, 13, 20, BOTH, FALSE},
524 { 36, 4, 23, IDOR, FALSE},
525 { 52, 4, 23, IDOR, TRUE},
526 { 100, 11, 30, ODOR, TRUE},
527 { 0},
528 }
529 },
530
531 {
532 "IL",
533 CE,
534 {
535 { 1, 3, 20, IDOR, FALSE},
536 { 4, 6, 20, BOTH, FALSE},
537 { 10, 4, 20, IDOR, FALSE},
538 { 0},
539 }
540 },
541
542 {
543 "IT",
544 CE,
545 {
546 { 1, 13, 20, BOTH, FALSE},
547 { 36, 4, 23, IDOR, FALSE},
548 { 52, 4, 23, IDOR, TRUE},
549 { 100, 11, 30, ODOR, TRUE},
550 { 0},
551 }
552 },
553
554 {
555 "JP",
556 JAP,
557 {
558 { 1, 14, 20, BOTH, FALSE},
559 { 36, 4, 23, IDOR, FALSE},
560 { 0},
561 }
562 },
563
564 {
565 "JO",
566 CE,
567 {
568 { 1, 13, 20, IDOR, FALSE},
569 { 36, 4, 23, IDOR, FALSE},
570 { 149, 4, 23, IDOR, FALSE},
571 { 0},
572 }
573 },
574
575 {
576 "LV",
577 CE,
578 {
579 { 1, 13, 20, BOTH, FALSE},
580 { 36, 4, 23, IDOR, FALSE},
581 { 52, 4, 23, IDOR, TRUE},
582 { 100, 11, 30, BOTH, TRUE},
583 { 0},
584 }
585 },
586
587 {
588 "LI",
589 CE,
590 {
591 { 1, 13, 20, BOTH, FALSE},
592 { 52, 4, 23, IDOR, TRUE},
593 { 100, 11, 30, BOTH, TRUE},
594 { 0},
595 }
596 },
597
598 {
599 "LT",
600 CE,
601 {
602 { 1, 13, 20, BOTH, FALSE},
603 { 36, 4, 23, IDOR, FALSE},
604 { 52, 4, 23, IDOR, TRUE},
605 { 100, 11, 30, BOTH, TRUE},
606 { 0},
607 }
608 },
609
610 {
611 "LU",
612 CE,
613 {
614 { 1, 13, 20, BOTH, FALSE},
615 { 36, 4, 23, IDOR, FALSE},
616 { 52, 4, 23, IDOR, TRUE},
617 { 100, 11, 30, BOTH, TRUE},
618 { 0},
619 }
620 },
621
622 {
623 "MY",
624 CE,
625 {
626 { 36, 4, 23, BOTH, FALSE},
627 { 52, 4, 23, BOTH, FALSE},
628 { 149, 5, 20, BOTH, FALSE},
629 { 0},
630 }
631 },
632
633 {
634 "MT",
635 CE,
636 {
637 { 1, 13, 20, BOTH, FALSE},
638 { 36, 4, 23, IDOR, FALSE},
639 { 52, 4, 23, IDOR, TRUE},
640 { 100, 11, 30, BOTH, TRUE},
641 { 0},
642 }
643 },
644
645 {
646 "MA",
647 CE,
648 {
649 { 1, 13, 20, BOTH, FALSE},
650 { 36, 4, 24, IDOR, FALSE},
651 { 0},
652 }
653 },
654
655 {
656 "MX",
657 CE,
658 {
659 { 1, 13, 20, BOTH, FALSE},
660 { 36, 4, 23, BOTH, FALSE},
661 { 52, 4, 24, BOTH, FALSE},
662 { 149, 5, 30, IDOR, FALSE},
663 { 0},
664 }
665 },
666
667 {
668 "NL",
669 CE,
670 {
671 { 1, 13, 20, BOTH, FALSE},
672 { 36, 4, 23, IDOR, FALSE},
673 { 52, 4, 24, IDOR, TRUE},
674 { 100, 11, 30, BOTH, TRUE},
675 { 0},
676 }
677 },
678
679 {
680 "NZ",
681 CE,
682 {
683 { 1, 13, 20, BOTH, FALSE},
684 { 36, 4, 24, BOTH, FALSE},
685 { 52, 4, 24, BOTH, FALSE},
686 { 149, 4, 30, BOTH, FALSE},
687 { 0},
688 }
689 },
690
691 {
692 "NO",
693 CE,
694 {
695 { 1, 13, 20, BOTH, FALSE},
696 { 36, 4, 24, IDOR, FALSE},
697 { 52, 4, 24, IDOR, TRUE},
698 { 100, 11, 30, BOTH, TRUE},
699 { 0},
700 }
701 },
702
703 {
704 "PE",
705 CE,
706 {
707 { 1, 13, 20, BOTH, FALSE},
708 { 149, 4, 27, BOTH, FALSE},
709 { 0},
710 }
711 },
712
713 {
714 "PT",
715 CE,
716 {
717 { 1, 13, 20, BOTH, FALSE},
718 { 36, 4, 23, IDOR, FALSE},
719 { 52, 4, 23, IDOR, TRUE},
720 { 100, 11, 30, BOTH, TRUE},
721 { 0},
722 }
723 },
724
725 {
726 "PL",
727 CE,
728 {
729 { 1, 13, 20, BOTH, FALSE},
730 { 36, 4, 23, IDOR, FALSE},
731 { 52, 4, 23, IDOR, TRUE},
732 { 100, 11, 30, BOTH, TRUE},
733 { 0},
734 }
735 },
736
737 {
738 "RO",
739 CE,
740 {
741 { 1, 13, 20, BOTH, FALSE},
742 { 36, 4, 23, IDOR, FALSE},
743 { 52, 4, 23, IDOR, TRUE},
744 { 100, 11, 30, BOTH, TRUE},
745 { 0},
746 }
747 },
748
749 {
750 "RU",
751 CE,
752 {
753 { 1, 13, 20, BOTH, FALSE},
754 { 149, 4, 20, IDOR, FALSE},
755 { 0},
756 }
757 },
758
759 {
760 "SA",
761 CE,
762 {
763 { 1, 13, 20, BOTH, FALSE},
764 { 36, 4, 23, BOTH, FALSE},
765 { 52, 4, 23, BOTH, FALSE},
766 { 149, 4, 23, BOTH, FALSE},
767 { 0},
768 }
769 },
770
771 {
772 "CS",
773 CE,
774 {
775 { 1, 13, 20, BOTH, FALSE},
776 { 0},
777 }
778 },
779
780 {
781 "SG",
782 CE,
783 {
784 { 1, 13, 20, BOTH, FALSE},
785 { 36, 4, 23, BOTH, FALSE},
786 { 52, 4, 23, BOTH, FALSE},
787 { 149, 4, 20, BOTH, FALSE},
788 { 0},
789 }
790 },
791
792 {
793 "SK",
794 CE,
795 {
796 { 1, 13, 20, BOTH, FALSE},
797 { 36, 4, 23, IDOR, FALSE},
798 { 52, 4, 23, IDOR, TRUE},
799 { 100, 11, 30, BOTH, TRUE},
800 { 0},
801 }
802 },
803
804 {
805 "SI",
806 CE,
807 {
808 { 1, 13, 20, BOTH, FALSE},
809 { 36, 4, 23, IDOR, FALSE},
810 { 52, 4, 23, IDOR, TRUE},
811 { 0},
812 }
813 },
814
815 {
816 "ZA",
817 CE,
818 {
819 { 1, 13, 20, BOTH, FALSE},
820 { 36, 4, 23, BOTH, FALSE},
821 { 52, 4, 23, IDOR, FALSE},
822 { 100, 11, 30, BOTH, TRUE},
823 { 149, 4, 30, BOTH, FALSE},
824 { 0},
825 }
826 },
827
828 {
829 "KR",
830 CE,
831 {
832 { 1, 13, 20, BOTH, FALSE},
833 { 36, 4, 20, BOTH, FALSE},
834 { 52, 4, 20, BOTH, FALSE},
835 { 100, 8, 20, BOTH, FALSE},
836 { 149, 4, 20, BOTH, FALSE},
837 { 0},
838 }
839 },
840
841 {
842 "ES",
843 CE,
844 {
845 { 1, 13, 20, BOTH, FALSE},
846 { 36, 4, 17, IDOR, FALSE},
847 { 52, 4, 23, IDOR, TRUE},
848 { 100, 11, 30, BOTH, TRUE},
849 { 0},
850 }
851 },
852
853 {
854 "SE",
855 CE,
856 {
857 { 1, 13, 20, BOTH, FALSE},
858 { 36, 4, 23, IDOR, FALSE},
859 { 52, 4, 23, IDOR, TRUE},
860 { 100, 11, 30, BOTH, TRUE},
861 { 0},
862 }
863 },
864
865 {
866 "CH",
867 CE,
868 {
869 { 1, 13, 20, BOTH, FALSE},
870 { 36, 4, 23, IDOR, TRUE},
871 { 52, 4, 23, IDOR, TRUE},
872 { 0},
873 }
874 },
875
876 {
877 "TW",
878 CE,
879 {
880 { 1, 11, 30, BOTH, FALSE},
881 { 52, 4, 23, IDOR, FALSE},
882 { 0},
883 }
884 },
885
886 {
887 "TR",
888 CE,
889 {
890 { 1, 13, 20, BOTH, FALSE},
891 { 36, 4, 23, BOTH, FALSE},
892 { 52, 4, 23, BOTH, FALSE},
893 { 0},
894 }
895 },
896
897 {
898 "GB",
899 CE,
900 {
901 { 1, 13, 20, BOTH, FALSE},
902 { 36, 4, 23, IDOR, FALSE},
903 { 52, 4, 23, IDOR, TRUE},
904 { 100, 11, 30, BOTH, TRUE},
905 { 0},
906 }
907 },
908
909 {
910 "UA",
911 CE,
912 {
913 { 1, 13, 20, BOTH, FALSE},
914 { 0},
915 }
916 },
917
918 {
919 "AE",
920 CE,
921 {
922 { 1, 13, 20, BOTH, FALSE},
923 { 0},
924 }
925 },
926
927 {
928 "US",
929 CE,
930 {
931 { 1, 11, 30, BOTH, FALSE},
932 { 36, 4, 17, IDOR, FALSE},
933 { 52, 4, 24, BOTH, TRUE},
934 { 100, 11, 30, BOTH, TRUE},
935 { 149, 5, 30, BOTH, FALSE},
936 { 0},
937 }
938 },
939
940 {
941 "VE",
942 CE,
943 {
944 { 1, 13, 20, BOTH, FALSE},
945 { 149, 4, 27, BOTH, FALSE},
946 { 0},
947 }
948 },
949
950 {
951 "",
952 CE,
953 {
954 { 1, 11, 20, BOTH, FALSE},
955 { 36, 4, 20, BOTH, FALSE},
956 { 52, 4, 20, BOTH, FALSE},
957 { 100, 11, 20, BOTH, FALSE},
958 { 149, 5, 20, BOTH, FALSE},
959 { 0},
960 }
961 },
962};
963
964
965static PCH_REGION GetChRegion(
966 IN PUCHAR CntryCode)
967{
968 INT loop = 0;
969 PCH_REGION pChRegion = NULL;
970
971 while (strcmp((PSTRING) ChRegion[loop].CountReg, "") != 0)
972 {
973 if (strncmp((PSTRING) ChRegion[loop].CountReg, (PSTRING) CntryCode, 2) == 0)
974 {
975 pChRegion = &ChRegion[loop];
976 break;
977 }
978 loop++;
979 }
980
981 if (pChRegion == NULL)
982 pChRegion = &ChRegion[loop];
983 return pChRegion;
984}
985
986static VOID ChBandCheck(
987 IN UCHAR PhyMode,
988 OUT PUCHAR pChType)
989{
990 switch(PhyMode)
991 {
992 case PHY_11A:
993#ifdef DOT11_N_SUPPORT
994 case PHY_11AN_MIXED:
995#endif
996 *pChType = BAND_5G;
997 break;
998 case PHY_11ABG_MIXED:
999#ifdef DOT11_N_SUPPORT
1000 case PHY_11AGN_MIXED:
1001 case PHY_11ABGN_MIXED:
1002#endif
1003 *pChType = BAND_BOTH;
1004 break;
1005
1006 default:
1007 *pChType = BAND_24G;
1008 break;
1009 }
1010}
1011
1012static UCHAR FillChList(
1013 IN PRTMP_ADAPTER pAd,
1014 IN PCH_DESP pChDesp,
1015 IN UCHAR Offset,
1016 IN UCHAR increment)
1017{
1018 INT i, j, l;
1019 UCHAR channel;
1020
1021 j = Offset;
1022 for (i = 0; i < pChDesp->NumOfCh; i++)
1023 {
1024 channel = pChDesp->FirstChannel + i * increment;
1025 for (l=0; l<MAX_NUM_OF_CHANNELS; l++)
1026 {
1027 if (channel == pAd->TxPower[l].Channel)
1028 {
1029 pAd->ChannelList[j].Power = pAd->TxPower[l].Power;
1030 pAd->ChannelList[j].Power2 = pAd->TxPower[l].Power2;
1031 break;
1032 }
1033 }
1034 if (l == MAX_NUM_OF_CHANNELS)
1035 continue;
1036
1037 pAd->ChannelList[j].Channel = pChDesp->FirstChannel + i * increment;
1038 pAd->ChannelList[j].MaxTxPwr = pChDesp->MaxTxPwr;
1039 pAd->ChannelList[j].DfsReq = pChDesp->DfsReq;
1040 j++;
1041 }
1042 pAd->ChannelListNum = j;
1043
1044 return j;
1045}
1046
1047
1048static inline VOID CreateChList(
1049 IN PRTMP_ADAPTER pAd,
1050 IN PCH_REGION pChRegion,
1051 IN UCHAR Geography)
1052{
1053 INT i;
1054 UCHAR offset = 0;
1055 PCH_DESP pChDesp;
1056 UCHAR ChType;
1057 UCHAR increment;
1058
1059 if (pChRegion == NULL)
1060 return;
1061
1062 ChBandCheck(pAd->CommonCfg.PhyMode, &ChType);
1063
1064 for (i=0; i<10; i++)
1065 {
1066 pChDesp = &pChRegion->ChDesp[i];
1067 if (pChDesp->FirstChannel == 0)
1068 break;
1069
1070 if (ChType == BAND_5G)
1071 {
1072 if (pChDesp->FirstChannel <= 14)
1073 continue;
1074 }
1075 else if (ChType == BAND_24G)
1076 {
1077 if (pChDesp->FirstChannel > 14)
1078 continue;
1079 }
1080
1081 if ((pChDesp->Geography == BOTH)
1082 || (pChDesp->Geography == Geography))
1083 {
1084 if (pChDesp->FirstChannel > 14)
1085 increment = 4;
1086 else
1087 increment = 1;
1088 offset = FillChList(pAd, pChDesp, offset, increment);
1089 }
1090 }
1091}
1092
1093
1094VOID BuildChannelListEx(
1095 IN PRTMP_ADAPTER pAd)
1096{
1097 PCH_REGION pChReg;
1098
1099 pChReg = GetChRegion(pAd->CommonCfg.CountryCode);
1100 CreateChList(pAd, pChReg, pAd->CommonCfg.Geography);
1101}
1102
1103
1104VOID BuildBeaconChList(
1105 IN PRTMP_ADAPTER pAd,
1106 OUT PUCHAR pBuf,
1107 OUT PULONG pBufLen)
1108{
1109 INT i;
1110 ULONG TmpLen;
1111 PCH_REGION pChRegion;
1112 PCH_DESP pChDesp;
1113 UCHAR ChType;
1114
1115 pChRegion = GetChRegion(pAd->CommonCfg.CountryCode);
1116
1117 if (pChRegion == NULL)
1118 return;
1119
1120 ChBandCheck(pAd->CommonCfg.PhyMode, &ChType);
1121 *pBufLen = 0;
1122
1123 for (i=0; i<10; i++)
1124 {
1125 pChDesp = &pChRegion->ChDesp[i];
1126 if (pChDesp->FirstChannel == 0)
1127 break;
1128
1129 if (ChType == BAND_5G)
1130 {
1131 if (pChDesp->FirstChannel <= 14)
1132 continue;
1133 }
1134 else if (ChType == BAND_24G)
1135 {
1136 if (pChDesp->FirstChannel > 14)
1137 continue;
1138 }
1139
1140 if ((pChDesp->Geography == BOTH)
1141 || (pChDesp->Geography == pAd->CommonCfg.Geography))
1142 {
1143 MakeOutgoingFrame(pBuf + *pBufLen, &TmpLen,
1144 1, &pChDesp->FirstChannel,
1145 1, &pChDesp->NumOfCh,
1146 1, &pChDesp->MaxTxPwr,
1147 END_OF_ARGS);
1148 *pBufLen += TmpLen;
1149 }
1150 }
1151}
1152
1153
1154#ifdef DOT11_N_SUPPORT
1155static BOOLEAN IsValidChannel(
1156 IN PRTMP_ADAPTER pAd,
1157 IN UCHAR channel)
1158
1159{
1160 INT i;
1161
1162 for (i = 0; i < pAd->ChannelListNum; i++)
1163 {
1164 if (pAd->ChannelList[i].Channel == channel)
1165 break;
1166 }
1167
1168 if (i == pAd->ChannelListNum)
1169 return FALSE;
1170 else
1171 return TRUE;
1172}
1173
1174
1175static UCHAR GetExtCh(
1176 IN UCHAR Channel,
1177 IN UCHAR Direction)
1178{
1179 CHAR ExtCh;
1180
1181 if (Direction == EXTCHA_ABOVE)
1182 ExtCh = Channel + 4;
1183 else
1184 ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0;
1185
1186 return ExtCh;
1187}
1188
1189
1190VOID N_ChannelCheck(
1191 IN PRTMP_ADAPTER pAd)
1192{
1193
1194 UCHAR Channel = pAd->CommonCfg.Channel;
1195
1196 if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40))
1197 {
1198 if (Channel > 14)
1199 {
1200 if ((Channel == 36) || (Channel == 44) || (Channel == 52) || (Channel == 60) || (Channel == 100) || (Channel == 108) ||
1201 (Channel == 116) || (Channel == 124) || (Channel == 132) || (Channel == 149) || (Channel == 157))
1202 {
1203 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1204 }
1205 else if ((Channel == 40) || (Channel == 48) || (Channel == 56) || (Channel == 64) || (Channel == 104) || (Channel == 112) ||
1206 (Channel == 120) || (Channel == 128) || (Channel == 136) || (Channel == 153) || (Channel == 161))
1207 {
1208 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1209 }
1210 else
1211 {
1212 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1213 }
1214 }
1215 else
1216 {
1217 do
1218 {
1219 UCHAR ExtCh;
1220 UCHAR Dir = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
1221 ExtCh = GetExtCh(Channel, Dir);
1222 if (IsValidChannel(pAd, ExtCh))
1223 break;
1224
1225 Dir = (Dir == EXTCHA_ABOVE) ? EXTCHA_BELOW : EXTCHA_ABOVE;
1226 ExtCh = GetExtCh(Channel, Dir);
1227 if (IsValidChannel(pAd, ExtCh))
1228 {
1229 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = Dir;
1230 break;
1231 }
1232 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1233 } while(FALSE);
1234
1235 if (Channel == 14)
1236 {
1237 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1238
1239 }
1240 }
1241 }
1242
1243
1244}
1245
1246
1247VOID N_SetCenCh(
1248 IN PRTMP_ADAPTER pAd)
1249{
1250 if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
1251 {
1252 if (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)
1253 {
1254 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2;
1255 }
1256 else
1257 {
1258 if (pAd->CommonCfg.Channel == 14)
1259 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 1;
1260 else
1261 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;
1262 }
1263 }
1264 else
1265 {
1266 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
1267 }
1268}
1269#endif
1270
1271
1272UINT8 GetCuntryMaxTxPwr(
1273 IN PRTMP_ADAPTER pAd,
1274 IN UINT8 channel)
1275{
1276 int i;
1277 for (i = 0; i < pAd->ChannelListNum; i++)
1278 {
1279 if (pAd->ChannelList[i].Channel == channel)
1280 break;
1281 }
1282
1283 if (i == pAd->ChannelListNum)
1284 return 0xff;
1285 else
1286 return pAd->ChannelList[i].MaxTxPwr;
1287}
1288