GUI: Fix Tomato RAF theme for all builds. Compilation typo.
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / drivers / staging / rt2860 / common / rt_channel.c
blob5387989811777ba1b3ae36a335bcfd830d9e2b2f
1 /*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
24 * *
25 *************************************************************************
27 #include "../rt_config.h"
29 struct rt_ch_freq_map CH_HZ_ID_MAP[] = {
30 {1, 2412}
32 {2, 2417}
34 {3, 2422}
36 {4, 2427}
38 {5, 2432}
40 {6, 2437}
42 {7, 2442}
44 {8, 2447}
46 {9, 2452}
48 {10, 2457}
50 {11, 2462}
52 {12, 2467}
54 {13, 2472}
56 {14, 2484}
59 /* UNII */
60 {36, 5180}
62 {40, 5200}
64 {44, 5220}
66 {48, 5240}
68 {52, 5260}
70 {56, 5280}
72 {60, 5300}
74 {64, 5320}
76 {149, 5745}
78 {153, 5765}
80 {157, 5785}
82 {161, 5805}
84 {165, 5825}
86 {167, 5835}
88 {169, 5845}
90 {171, 5855}
92 {173, 5865}
95 /* HiperLAN2 */
96 {100, 5500}
98 {104, 5520}
100 {108, 5540}
102 {112, 5560}
104 {116, 5580}
106 {120, 5600}
108 {124, 5620}
110 {128, 5640}
112 {132, 5660}
114 {136, 5680}
116 {140, 5700}
119 /* Japan MMAC */
120 {34, 5170}
122 {38, 5190}
124 {42, 5210}
126 {46, 5230}
129 /* Japan */
130 {184, 4920}
132 {188, 4940}
134 {192, 4960}
136 {196, 4980}
139 {208, 5040}
140 , /* Japan, means J08 */
141 {212, 5060}
142 , /* Japan, means J12 */
143 {216, 5080}
144 , /* Japan, means J16 */
147 int CH_HZ_ID_MAP_NUM = (sizeof(CH_HZ_ID_MAP) / sizeof(struct rt_ch_freq_map));
149 struct rt_ch_region ChRegion[] = {
150 { /* Antigua and Berbuda */
151 "AG",
154 {1, 13, 20, BOTH, FALSE}
155 , /* 2.4 G, ch 1~13 */
156 {36, 4, 23, BOTH, FALSE}
157 , /* 5G, ch 36~48 */
158 {52, 4, 23, BOTH, FALSE}
159 , /* 5G, ch 52~64 */
160 {100, 11, 30, BOTH, FALSE}
161 , /* 5G, ch 100~140 */
163 , /* end */
168 { /* Argentina */
169 "AR",
172 {1, 13, 20, BOTH, FALSE}
173 , /* 2.4 G, ch 1~13 */
174 {52, 4, 24, BOTH, FALSE}
175 , /* 5G, ch 52~64 */
176 {149, 4, 30, BOTH, FALSE}
177 , /* 5G, ch 149~161 */
179 , /* end */
184 { /* Aruba */
185 "AW",
188 {1, 13, 20, BOTH, FALSE}
189 , /* 2.4 G, ch 1~13 */
190 {36, 4, 23, BOTH, FALSE}
191 , /* 5G, ch 36~48 */
192 {52, 4, 23, BOTH, FALSE}
193 , /* 5G, ch 52~64 */
194 {100, 11, 30, BOTH, FALSE}
195 , /* 5G, ch 100~140 */
197 , /* end */
202 { /* Australia */
203 "AU",
206 {1, 13, 20, BOTH, FALSE}
207 , /* 2.4 G, ch 1~13 */
208 {36, 4, 23, BOTH, FALSE}
209 , /* 5G, ch 36~48 */
210 {52, 4, 24, BOTH, FALSE}
211 , /* 5G, ch 52~64 */
212 {149, 5, 30, BOTH, FALSE}
213 , /* 5G, ch 149~165 */
215 , /* end */
220 { /* Austria */
221 "AT",
224 {1, 13, 20, BOTH, FALSE}
225 , /* 2.4 G, ch 1~13 */
226 {36, 4, 23, IDOR, TRUE}
227 , /* 5G, ch 36~48 */
228 {52, 4, 23, IDOR, TRUE}
229 , /* 5G, ch 52~64 */
230 {100, 11, 30, BOTH, TRUE}
231 , /* 5G, ch 100~140 */
233 , /* end */
238 { /* Bahamas */
239 "BS",
242 {1, 13, 20, BOTH, FALSE}
243 , /* 2.4 G, ch 1~13 */
244 {36, 4, 23, BOTH, FALSE}
245 , /* 5G, ch 36~48 */
246 {52, 4, 24, BOTH, FALSE}
247 , /* 5G, ch 52~64 */
248 {149, 5, 30, BOTH, FALSE}
249 , /* 5G, ch 149~165 */
251 , /* end */
256 { /* Barbados */
257 "BB",
260 {1, 13, 20, BOTH, FALSE}
261 , /* 2.4 G, ch 1~13 */
262 {36, 4, 23, BOTH, FALSE}
263 , /* 5G, ch 36~48 */
264 {52, 4, 24, BOTH, FALSE}
265 , /* 5G, ch 52~64 */
266 {100, 11, 30, BOTH, FALSE}
267 , /* 5G, ch 100~140 */
269 , /* end */
274 { /* Bermuda */
275 "BM",
278 {1, 13, 20, BOTH, FALSE}
279 , /* 2.4 G, ch 1~13 */
280 {36, 4, 23, BOTH, FALSE}
281 , /* 5G, ch 36~48 */
282 {52, 4, 24, BOTH, FALSE}
283 , /* 5G, ch 52~64 */
284 {100, 11, 30, BOTH, FALSE}
285 , /* 5G, ch 100~140 */
287 , /* end */
292 { /* Brazil */
293 "BR",
296 {1, 13, 20, BOTH, FALSE}
297 , /* 2.4 G, ch 1~13 */
298 {36, 4, 23, BOTH, FALSE}
299 , /* 5G, ch 36~48 */
300 {52, 4, 24, BOTH, FALSE}
301 , /* 5G, ch 52~64 */
302 {100, 11, 24, BOTH, FALSE}
303 , /* 5G, ch 100~140 */
304 {149, 5, 30, BOTH, FALSE}
305 , /* 5G, ch 100~140 */
307 , /* end */
312 { /* Belgium */
313 "BE",
316 {1, 13, 20, BOTH, FALSE}
317 , /* 2.4 G, ch 1~13 */
318 {36, 4, 18, IDOR, FALSE}
319 , /* 5G, ch 36~48 */
320 {52, 4, 18, IDOR, FALSE}
321 , /* 5G, ch 52~64 */
323 , /* end */
328 { /* Bulgaria */
329 "BG",
332 {1, 13, 20, BOTH, FALSE}
333 , /* 2.4 G, ch 1~13 */
334 {36, 4, 23, IDOR, FALSE}
335 , /* 5G, ch 36~48 */
336 {52, 4, 23, IDOR, TRUE}
337 , /* 5G, ch 52~64 */
338 {100, 11, 30, ODOR, TRUE}
339 , /* 5G, ch 100~140 */
341 , /* end */
346 { /* Canada */
347 "CA",
350 {1, 13, 20, BOTH, FALSE}
351 , /* 2.4 G, ch 1~13 */
352 {36, 4, 23, BOTH, FALSE}
353 , /* 5G, ch 36~48 */
354 {52, 4, 23, BOTH, FALSE}
355 , /* 5G, ch 52~64 */
356 {149, 5, 30, BOTH, FALSE}
357 , /* 5G, ch 149~165 */
359 , /* end */
364 { /* Cayman IsLands */
365 "KY",
368 {1, 13, 20, BOTH, FALSE}
369 , /* 2.4 G, ch 1~13 */
370 {36, 4, 23, BOTH, FALSE}
371 , /* 5G, ch 36~48 */
372 {52, 4, 24, BOTH, FALSE}
373 , /* 5G, ch 52~64 */
374 {100, 11, 30, BOTH, FALSE}
375 , /* 5G, ch 100~140 */
377 , /* end */
382 { /* Chile */
383 "CL",
386 {1, 13, 20, BOTH, FALSE}
387 , /* 2.4 G, ch 1~13 */
388 {36, 4, 20, BOTH, FALSE}
389 , /* 5G, ch 36~48 */
390 {52, 4, 20, BOTH, FALSE}
391 , /* 5G, ch 52~64 */
392 {149, 5, 20, BOTH, FALSE}
393 , /* 5G, ch 149~165 */
395 , /* end */
400 { /* China */
401 "CN",
404 {1, 13, 20, BOTH, FALSE}
405 , /* 2.4 G, ch 1~13 */
406 {149, 4, 27, BOTH, FALSE}
407 , /* 5G, ch 149~161 */
409 , /* end */
414 { /* Colombia */
415 "CO",
418 {1, 13, 20, BOTH, FALSE}
419 , /* 2.4 G, ch 1~13 */
420 {36, 4, 17, BOTH, FALSE}
421 , /* 5G, ch 36~48 */
422 {52, 4, 24, BOTH, FALSE}
423 , /* 5G, ch 52~64 */
424 {100, 11, 30, BOTH, FALSE}
425 , /* 5G, ch 100~140 */
426 {149, 5, 30, BOTH, FALSE}
427 , /* 5G, ch 149~165 */
429 , /* end */
434 { /* Costa Rica */
435 "CR",
438 {1, 13, 20, BOTH, FALSE}
439 , /* 2.4 G, ch 1~13 */
440 {36, 4, 17, BOTH, FALSE}
441 , /* 5G, ch 36~48 */
442 {52, 4, 24, BOTH, FALSE}
443 , /* 5G, ch 52~64 */
444 {149, 4, 30, BOTH, FALSE}
445 , /* 5G, ch 149~161 */
447 , /* end */
452 { /* Cyprus */
453 "CY",
456 {1, 13, 20, BOTH, FALSE}
457 , /* 2.4 G, ch 1~13 */
458 {36, 4, 23, IDOR, FALSE}
459 , /* 5G, ch 36~48 */
460 {52, 4, 24, IDOR, TRUE}
461 , /* 5G, ch 52~64 */
462 {100, 11, 30, BOTH, TRUE}
463 , /* 5G, ch 100~140 */
465 , /* end */
470 { /* Czech_Republic */
471 "CZ",
474 {1, 13, 20, BOTH, FALSE}
475 , /* 2.4 G, ch 1~13 */
476 {36, 4, 23, IDOR, FALSE}
477 , /* 5G, ch 36~48 */
478 {52, 4, 23, IDOR, TRUE}
479 , /* 5G, ch 52~64 */
481 , /* end */
486 { /* Denmark */
487 "DK",
490 {1, 13, 20, BOTH, FALSE}
491 , /* 2.4 G, ch 1~13 */
492 {36, 4, 23, IDOR, FALSE}
493 , /* 5G, ch 36~48 */
494 {52, 4, 23, IDOR, TRUE}
495 , /* 5G, ch 52~64 */
496 {100, 11, 30, BOTH, TRUE}
497 , /* 5G, ch 100~140 */
499 , /* end */
504 { /* Dominican Republic */
505 "DO",
508 {1, 0, 20, BOTH, FALSE}
509 , /* 2.4 G, ch 0 */
510 {149, 4, 20, BOTH, FALSE}
511 , /* 5G, ch 149~161 */
513 , /* end */
518 { /* Equador */
519 "EC",
522 {1, 13, 20, BOTH, FALSE}
523 , /* 2.4 G, ch 1~13 */
524 {100, 11, 27, BOTH, FALSE}
525 , /* 5G, ch 100~140 */
527 , /* end */
532 { /* El Salvador */
533 "SV",
536 {1, 13, 20, BOTH, FALSE}
537 , /* 2.4 G, ch 1~13 */
538 {36, 4, 23, IDOR, FALSE}
539 , /* 5G, ch 36~48 */
540 {52, 4, 30, BOTH, TRUE}
541 , /* 5G, ch 52~64 */
542 {149, 4, 36, BOTH, TRUE}
543 , /* 5G, ch 149~165 */
545 , /* end */
550 { /* Finland */
551 "FI",
554 {1, 13, 20, BOTH, FALSE}
555 , /* 2.4 G, ch 1~13 */
556 {36, 4, 23, IDOR, FALSE}
557 , /* 5G, ch 36~48 */
558 {52, 4, 23, IDOR, TRUE}
559 , /* 5G, ch 52~64 */
560 {100, 11, 30, BOTH, TRUE}
561 , /* 5G, ch 100~140 */
563 , /* end */
568 { /* France */
569 "FR",
572 {1, 13, 20, BOTH, FALSE}
573 , /* 2.4 G, ch 1~13 */
574 {36, 4, 23, IDOR, FALSE}
575 , /* 5G, ch 36~48 */
576 {52, 4, 23, IDOR, TRUE}
577 , /* 5G, ch 52~64 */
579 , /* end */
584 { /* Germany */
585 "DE",
588 {1, 13, 20, BOTH, FALSE}
589 , /* 2.4 G, ch 1~13 */
590 {36, 4, 23, IDOR, FALSE}
591 , /* 5G, ch 36~48 */
592 {52, 4, 23, IDOR, TRUE}
593 , /* 5G, ch 52~64 */
594 {100, 11, 30, BOTH, TRUE}
595 , /* 5G, ch 100~140 */
597 , /* end */
602 { /* Greece */
603 "GR",
606 {1, 13, 20, BOTH, FALSE}
607 , /* 2.4 G, ch 1~13 */
608 {36, 4, 23, IDOR, FALSE}
609 , /* 5G, ch 36~48 */
610 {52, 4, 23, IDOR, TRUE}
611 , /* 5G, ch 52~64 */
612 {100, 11, 30, ODOR, TRUE}
613 , /* 5G, ch 100~140 */
615 , /* end */
620 { /* Guam */
621 "GU",
624 {1, 11, 20, BOTH, FALSE}
625 , /* 2.4 G, ch 1~11 */
626 {36, 4, 17, BOTH, FALSE}
627 , /* 5G, ch 36~48 */
628 {52, 4, 24, BOTH, FALSE}
629 , /* 5G, ch 52~64 */
630 {100, 11, 30, BOTH, FALSE}
631 , /* 5G, ch 100~140 */
632 {149, 5, 30, BOTH, FALSE}
633 , /* 5G, ch 149~165 */
635 , /* end */
640 { /* Guatemala */
641 "GT",
644 {1, 13, 20, BOTH, FALSE}
645 , /* 2.4 G, ch 1~13 */
646 {36, 4, 17, BOTH, FALSE}
647 , /* 5G, ch 36~48 */
648 {52, 4, 24, BOTH, FALSE}
649 , /* 5G, ch 52~64 */
650 {149, 4, 30, BOTH, FALSE}
651 , /* 5G, ch 149~161 */
653 , /* end */
658 { /* Haiti */
659 "HT",
662 {1, 13, 20, BOTH, FALSE}
663 , /* 2.4 G, ch 1~13 */
664 {36, 4, 17, BOTH, FALSE}
665 , /* 5G, ch 36~48 */
666 {52, 4, 24, BOTH, FALSE}
667 , /* 5G, ch 52~64 */
668 {149, 4, 30, BOTH, FALSE}
669 , /* 5G, ch 149~161 */
671 , /* end */
676 { /* Honduras */
677 "HN",
680 {1, 13, 20, BOTH, FALSE}
681 , /* 2.4 G, ch 1~13 */
682 {149, 4, 27, BOTH, FALSE}
683 , /* 5G, ch 149~161 */
685 , /* end */
690 { /* Hong Kong */
691 "HK",
694 {1, 13, 20, BOTH, FALSE}
695 , /* 2.4 G, ch 1~13 */
696 {36, 4, 23, IDOR, FALSE}
697 , /* 5G, ch 36~48 */
698 {52, 4, 23, IDOR, FALSE}
699 , /* 5G, ch 52~64 */
700 {149, 4, 30, BOTH, FALSE}
701 , /* 5G, ch 149~161 */
703 , /* end */
708 { /* Hungary */
709 "HU",
712 {1, 13, 20, BOTH, FALSE}
713 , /* 2.4 G, ch 1~13 */
714 {36, 4, 23, IDOR, FALSE}
715 , /* 5G, ch 36~48 */
716 {52, 4, 23, IDOR, TRUE}
717 , /* 5G, ch 52~64 */
719 , /* end */
724 { /* Iceland */
725 "IS",
728 {1, 13, 20, BOTH, FALSE}
729 , /* 2.4 G, ch 1~13 */
730 {36, 4, 23, IDOR, FALSE}
731 , /* 5G, ch 36~48 */
732 {52, 4, 23, IDOR, TRUE}
733 , /* 5G, ch 52~64 */
734 {100, 11, 30, BOTH, TRUE}
735 , /* 5G, ch 100~140 */
737 , /* end */
742 { /* India */
743 "IN",
746 {1, 13, 20, BOTH, FALSE}
747 , /* 2.4 G, ch 1~13 */
748 {149, 4, 24, IDOR, FALSE}
749 , /* 5G, ch 149~161 */
751 , /* end */
756 { /* Indonesia */
757 "ID",
760 {1, 13, 20, BOTH, FALSE}
761 , /* 2.4 G, ch 1~13 */
762 {149, 4, 27, BOTH, FALSE}
763 , /* 5G, ch 149~161 */
765 , /* end */
770 { /* Ireland */
771 "IE",
774 {1, 13, 20, BOTH, FALSE}
775 , /* 2.4 G, ch 1~13 */
776 {36, 4, 23, IDOR, FALSE}
777 , /* 5G, ch 36~48 */
778 {52, 4, 23, IDOR, TRUE}
779 , /* 5G, ch 52~64 */
780 {100, 11, 30, ODOR, TRUE}
781 , /* 5G, ch 100~140 */
783 , /* end */
788 { /* Israel */
789 "IL",
792 {1, 3, 20, IDOR, FALSE}
793 , /* 2.4 G, ch 1~3 */
794 {4, 6, 20, BOTH, FALSE}
795 , /* 2.4 G, ch 4~9 */
796 {10, 4, 20, IDOR, FALSE}
797 , /* 2.4 G, ch 10~13 */
799 , /* end */
804 { /* Italy */
805 "IT",
808 {1, 13, 20, BOTH, FALSE}
809 , /* 2.4 G, ch 1~13 */
810 {36, 4, 23, IDOR, FALSE}
811 , /* 5G, ch 36~48 */
812 {52, 4, 23, IDOR, TRUE}
813 , /* 5G, ch 52~64 */
814 {100, 11, 30, ODOR, TRUE}
815 , /* 5G, ch 100~140 */
817 , /* end */
822 { /* Japan */
823 "JP",
824 JAP,
826 {1, 14, 20, BOTH, FALSE}
827 , /* 2.4 G, ch 1~14 */
828 {36, 4, 23, IDOR, FALSE}
829 , /* 5G, ch 36~48 */
831 , /* end */
836 { /* Jordan */
837 "JO",
840 {1, 13, 20, IDOR, FALSE}
841 , /* 2.4 G, ch 1~13 */
842 {36, 4, 23, IDOR, FALSE}
843 , /* 5G, ch 36~48 */
844 {149, 4, 23, IDOR, FALSE}
845 , /* 5G, ch 149~161 */
847 , /* end */
852 { /* Latvia */
853 "LV",
856 {1, 13, 20, BOTH, FALSE}
857 , /* 2.4 G, ch 1~13 */
858 {36, 4, 23, IDOR, FALSE}
859 , /* 5G, ch 36~48 */
860 {52, 4, 23, IDOR, TRUE}
861 , /* 5G, ch 52~64 */
862 {100, 11, 30, BOTH, TRUE}
863 , /* 5G, ch 100~140 */
865 , /* end */
870 { /* Liechtenstein */
871 "LI",
874 {1, 13, 20, BOTH, FALSE}
875 , /* 2.4 G, ch 1~13 */
876 {52, 4, 23, IDOR, TRUE}
877 , /* 5G, ch 52~64 */
878 {100, 11, 30, BOTH, TRUE}
879 , /* 5G, ch 100~140 */
881 , /* end */
886 { /* Lithuania */
887 "LT",
890 {1, 13, 20, BOTH, FALSE}
891 , /* 2.4 G, ch 1~13 */
892 {36, 4, 23, IDOR, FALSE}
893 , /* 5G, ch 36~48 */
894 {52, 4, 23, IDOR, TRUE}
895 , /* 5G, ch 52~64 */
896 {100, 11, 30, BOTH, TRUE}
897 , /* 5G, ch 100~140 */
899 , /* end */
904 { /* Luxemburg */
905 "LU",
908 {1, 13, 20, BOTH, FALSE}
909 , /* 2.4 G, ch 1~13 */
910 {36, 4, 23, IDOR, FALSE}
911 , /* 5G, ch 36~48 */
912 {52, 4, 23, IDOR, TRUE}
913 , /* 5G, ch 52~64 */
914 {100, 11, 30, BOTH, TRUE}
915 , /* 5G, ch 100~140 */
917 , /* end */
922 { /* Malaysia */
923 "MY",
926 {36, 4, 23, BOTH, FALSE}
927 , /* 5G, ch 36~48 */
928 {52, 4, 23, BOTH, FALSE}
929 , /* 5G, ch 52~64 */
930 {149, 5, 20, BOTH, FALSE}
931 , /* 5G, ch 149~165 */
933 , /* end */
938 { /* Malta */
939 "MT",
942 {1, 13, 20, BOTH, FALSE}
943 , /* 2.4 G, ch 1~13 */
944 {36, 4, 23, IDOR, FALSE}
945 , /* 5G, ch 36~48 */
946 {52, 4, 23, IDOR, TRUE}
947 , /* 5G, ch 52~64 */
948 {100, 11, 30, BOTH, TRUE}
949 , /* 5G, ch 100~140 */
951 , /* end */
956 { /* Marocco */
957 "MA",
960 {1, 13, 20, BOTH, FALSE}
961 , /* 2.4 G, ch 1~13 */
962 {36, 4, 24, IDOR, FALSE}
963 , /* 5G, ch 36~48 */
965 , /* end */
970 { /* Mexico */
971 "MX",
974 {1, 13, 20, BOTH, FALSE}
975 , /* 2.4 G, ch 1~13 */
976 {36, 4, 23, BOTH, FALSE}
977 , /* 5G, ch 36~48 */
978 {52, 4, 24, BOTH, FALSE}
979 , /* 5G, ch 52~64 */
980 {149, 5, 30, IDOR, FALSE}
981 , /* 5G, ch 149~165 */
983 , /* end */
988 { /* Netherlands */
989 "NL",
992 {1, 13, 20, BOTH, FALSE}
993 , /* 2.4 G, ch 1~13 */
994 {36, 4, 23, IDOR, FALSE}
995 , /* 5G, ch 36~48 */
996 {52, 4, 24, IDOR, TRUE}
997 , /* 5G, ch 52~64 */
998 {100, 11, 30, BOTH, TRUE}
999 , /* 5G, ch 100~140 */
1001 , /* end */
1006 { /* New Zealand */
1007 "NZ",
1010 {1, 13, 20, BOTH, FALSE}
1011 , /* 2.4 G, ch 1~13 */
1012 {36, 4, 24, BOTH, FALSE}
1013 , /* 5G, ch 36~48 */
1014 {52, 4, 24, BOTH, FALSE}
1015 , /* 5G, ch 52~64 */
1016 {149, 4, 30, BOTH, FALSE}
1017 , /* 5G, ch 149~161 */
1019 , /* end */
1024 { /* Norway */
1025 "NO",
1028 {1, 13, 20, BOTH, FALSE}
1029 , /* 2.4 G, ch 1~13 */
1030 {36, 4, 24, IDOR, FALSE}
1031 , /* 5G, ch 36~48 */
1032 {52, 4, 24, IDOR, TRUE}
1033 , /* 5G, ch 52~64 */
1034 {100, 11, 30, BOTH, TRUE}
1035 , /* 5G, ch 149~161 */
1037 , /* end */
1042 { /* Peru */
1043 "PE",
1046 {1, 13, 20, BOTH, FALSE}
1047 , /* 2.4 G, ch 1~13 */
1048 {149, 4, 27, BOTH, FALSE}
1049 , /* 5G, ch 149~161 */
1051 , /* end */
1056 { /* Portugal */
1057 "PT",
1060 {1, 13, 20, BOTH, FALSE}
1061 , /* 2.4 G, ch 1~13 */
1062 {36, 4, 23, IDOR, FALSE}
1063 , /* 5G, ch 36~48 */
1064 {52, 4, 23, IDOR, TRUE}
1065 , /* 5G, ch 52~64 */
1066 {100, 11, 30, BOTH, TRUE}
1067 , /* 5G, ch 100~140 */
1069 , /* end */
1074 { /* Poland */
1075 "PL",
1078 {1, 13, 20, BOTH, FALSE}
1079 , /* 2.4 G, ch 1~13 */
1080 {36, 4, 23, IDOR, FALSE}
1081 , /* 5G, ch 36~48 */
1082 {52, 4, 23, IDOR, TRUE}
1083 , /* 5G, ch 52~64 */
1084 {100, 11, 30, BOTH, TRUE}
1085 , /* 5G, ch 100~140 */
1087 , /* end */
1092 { /* Romania */
1093 "RO",
1096 {1, 13, 20, BOTH, FALSE}
1097 , /* 2.4 G, ch 1~13 */
1098 {36, 4, 23, IDOR, FALSE}
1099 , /* 5G, ch 36~48 */
1100 {52, 4, 23, IDOR, TRUE}
1101 , /* 5G, ch 52~64 */
1102 {100, 11, 30, BOTH, TRUE}
1103 , /* 5G, ch 100~140 */
1105 , /* end */
1110 { /* Russia */
1111 "RU",
1114 {1, 13, 20, BOTH, FALSE}
1115 , /* 2.4 G, ch 1~13 */
1116 {149, 4, 20, IDOR, FALSE}
1117 , /* 5G, ch 149~161 */
1119 , /* end */
1124 { /* Saudi Arabia */
1125 "SA",
1128 {1, 13, 20, BOTH, FALSE}
1129 , /* 2.4 G, ch 1~13 */
1130 {36, 4, 23, BOTH, FALSE}
1131 , /* 5G, ch 36~48 */
1132 {52, 4, 23, BOTH, FALSE}
1133 , /* 5G, ch 52~64 */
1134 {149, 4, 23, BOTH, FALSE}
1135 , /* 5G, ch 149~161 */
1137 , /* end */
1142 { /* Serbia_and_Montenegro */
1143 "CS",
1146 {1, 13, 20, BOTH, FALSE}
1147 , /* 2.4 G, ch 1~13 */
1149 , /* end */
1154 { /* Singapore */
1155 "SG",
1158 {1, 13, 20, BOTH, FALSE}
1159 , /* 2.4 G, ch 1~13 */
1160 {36, 4, 23, BOTH, FALSE}
1161 , /* 5G, ch 36~48 */
1162 {52, 4, 23, BOTH, FALSE}
1163 , /* 5G, ch 52~64 */
1164 {149, 4, 20, BOTH, FALSE}
1165 , /* 5G, ch 149~161 */
1167 , /* end */
1172 { /* Slovakia */
1173 "SK",
1176 {1, 13, 20, BOTH, FALSE}
1177 , /* 2.4 G, ch 1~13 */
1178 {36, 4, 23, IDOR, FALSE}
1179 , /* 5G, ch 36~48 */
1180 {52, 4, 23, IDOR, TRUE}
1181 , /* 5G, ch 52~64 */
1182 {100, 11, 30, BOTH, TRUE}
1183 , /* 5G, ch 100~140 */
1185 , /* end */
1190 { /* Slovenia */
1191 "SI",
1194 {1, 13, 20, BOTH, FALSE}
1195 , /* 2.4 G, ch 1~13 */
1196 {36, 4, 23, IDOR, FALSE}
1197 , /* 5G, ch 36~48 */
1198 {52, 4, 23, IDOR, TRUE}
1199 , /* 5G, ch 52~64 */
1201 , /* end */
1206 { /* South Africa */
1207 "ZA",
1210 {1, 13, 20, BOTH, FALSE}
1211 , /* 2.4 G, ch 1~13 */
1212 {36, 4, 23, BOTH, FALSE}
1213 , /* 5G, ch 36~48 */
1214 {52, 4, 23, IDOR, FALSE}
1215 , /* 5G, ch 52~64 */
1216 {100, 11, 30, BOTH, TRUE}
1217 , /* 5G, ch 100~140 */
1218 {149, 4, 30, BOTH, FALSE}
1219 , /* 5G, ch 149~161 */
1221 , /* end */
1226 { /* South Korea */
1227 "KR",
1230 {1, 13, 20, BOTH, FALSE}
1231 , /* 2.4 G, ch 1~13 */
1232 {36, 4, 20, BOTH, FALSE}
1233 , /* 5G, ch 36~48 */
1234 {52, 4, 20, BOTH, FALSE}
1235 , /* 5G, ch 52~64 */
1236 {100, 8, 20, BOTH, FALSE}
1237 , /* 5G, ch 100~128 */
1238 {149, 4, 20, BOTH, FALSE}
1239 , /* 5G, ch 149~161 */
1241 , /* end */
1246 { /* Spain */
1247 "ES",
1250 {1, 13, 20, BOTH, FALSE}
1251 , /* 2.4 G, ch 1~13 */
1252 {36, 4, 17, IDOR, FALSE}
1253 , /* 5G, ch 36~48 */
1254 {52, 4, 23, IDOR, TRUE}
1255 , /* 5G, ch 52~64 */
1256 {100, 11, 30, BOTH, TRUE}
1257 , /* 5G, ch 100~140 */
1259 , /* end */
1264 { /* Sweden */
1265 "SE",
1268 {1, 13, 20, BOTH, FALSE}
1269 , /* 2.4 G, ch 1~13 */
1270 {36, 4, 23, IDOR, FALSE}
1271 , /* 5G, ch 36~48 */
1272 {52, 4, 23, IDOR, TRUE}
1273 , /* 5G, ch 52~64 */
1274 {100, 11, 30, BOTH, TRUE}
1275 , /* 5G, ch 100~140 */
1277 , /* end */
1282 { /* Switzerland */
1283 "CH",
1286 {1, 13, 20, BOTH, FALSE}
1287 , /* 2.4 G, ch 1~13 */
1288 {36, 4, 23, IDOR, TRUE}
1289 , /* 5G, ch 36~48 */
1290 {52, 4, 23, IDOR, TRUE}
1291 , /* 5G, ch 52~64 */
1293 , /* end */
1298 { /* Taiwan */
1299 "TW",
1302 {1, 11, 30, BOTH, FALSE}
1303 , /* 2.4 G, ch 1~11 */
1304 {52, 4, 23, IDOR, FALSE}
1305 , /* 5G, ch 52~64 */
1307 , /* end */
1312 { /* Turkey */
1313 "TR",
1316 {1, 13, 20, BOTH, FALSE}
1317 , /* 2.4 G, ch 1~11 */
1318 {36, 4, 23, BOTH, FALSE}
1319 , /* 5G, ch 36~48 */
1320 {52, 4, 23, BOTH, FALSE}
1321 , /* 5G, ch 52~64 */
1323 , /* end */
1328 { /* UK */
1329 "GB",
1332 {1, 13, 20, BOTH, FALSE}
1333 , /* 2.4 G, ch 1~11 */
1334 {36, 4, 23, IDOR, FALSE}
1335 , /* 5G, ch 52~64 */
1336 {52, 4, 23, IDOR, TRUE}
1337 , /* 5G, ch 52~64 */
1338 {100, 11, 30, BOTH, TRUE}
1339 , /* 5G, ch 100~140 */
1341 , /* end */
1346 { /* Ukraine */
1347 "UA",
1350 {1, 13, 20, BOTH, FALSE}
1351 , /* 2.4 G, ch 1~11 */
1353 , /* end */
1358 { /* United_Arab_Emirates */
1359 "AE",
1362 {1, 13, 20, BOTH, FALSE}
1363 , /* 2.4 G, ch 1~11 */
1365 , /* end */
1370 { /* United_States */
1371 "US",
1374 {1, 11, 30, BOTH, FALSE}
1375 , /* 2.4 G, ch 1~11 */
1376 {36, 4, 17, IDOR, FALSE}
1377 , /* 5G, ch 52~64 */
1378 {52, 4, 24, BOTH, TRUE}
1379 , /* 5G, ch 52~64 */
1380 {100, 11, 30, BOTH, TRUE}
1381 , /* 5G, ch 100~140 */
1382 {149, 5, 30, BOTH, FALSE}
1383 , /* 5G, ch 149~165 */
1385 , /* end */
1390 { /* Venezuela */
1391 "VE",
1394 {1, 13, 20, BOTH, FALSE}
1395 , /* 2.4 G, ch 1~11 */
1396 {149, 4, 27, BOTH, FALSE}
1397 , /* 5G, ch 149~161 */
1399 , /* end */
1404 { /* Default */
1408 {1, 11, 20, BOTH, FALSE}
1409 , /* 2.4 G, ch 1~11 */
1410 {36, 4, 20, BOTH, FALSE}
1411 , /* 5G, ch 52~64 */
1412 {52, 4, 20, BOTH, FALSE}
1413 , /* 5G, ch 52~64 */
1414 {100, 11, 20, BOTH, FALSE}
1415 , /* 5G, ch 100~140 */
1416 {149, 5, 20, BOTH, FALSE}
1417 , /* 5G, ch 149~165 */
1419 , /* end */
1425 static struct rt_ch_region *GetChRegion(u8 *CntryCode)
1427 int loop = 0;
1428 struct rt_ch_region *pChRegion = NULL;
1430 while (strcmp((char *)ChRegion[loop].CountReg, "") != 0) {
1431 if (strncmp
1432 ((char *)ChRegion[loop].CountReg, (char *)CntryCode,
1433 2) == 0) {
1434 pChRegion = &ChRegion[loop];
1435 break;
1437 loop++;
1440 if (pChRegion == NULL)
1441 pChRegion = &ChRegion[loop];
1442 return pChRegion;
1445 static void ChBandCheck(u8 PhyMode, u8 *pChType)
1447 switch (PhyMode) {
1448 case PHY_11A:
1449 case PHY_11AN_MIXED:
1450 *pChType = BAND_5G;
1451 break;
1452 case PHY_11ABG_MIXED:
1453 case PHY_11AGN_MIXED:
1454 case PHY_11ABGN_MIXED:
1455 *pChType = BAND_BOTH;
1456 break;
1458 default:
1459 *pChType = BAND_24G;
1460 break;
1464 static u8 FillChList(struct rt_rtmp_adapter *pAd,
1465 struct rt_ch_desp *pChDesp,
1466 u8 Offset, u8 increment)
1468 int i, j, l;
1469 u8 channel;
1471 j = Offset;
1472 for (i = 0; i < pChDesp->NumOfCh; i++) {
1473 channel = pChDesp->FirstChannel + i * increment;
1474 for (l = 0; l < MAX_NUM_OF_CHANNELS; l++) {
1475 if (channel == pAd->TxPower[l].Channel) {
1476 pAd->ChannelList[j].Power =
1477 pAd->TxPower[l].Power;
1478 pAd->ChannelList[j].Power2 =
1479 pAd->TxPower[l].Power2;
1480 break;
1483 if (l == MAX_NUM_OF_CHANNELS)
1484 continue;
1486 pAd->ChannelList[j].Channel =
1487 pChDesp->FirstChannel + i * increment;
1488 pAd->ChannelList[j].MaxTxPwr = pChDesp->MaxTxPwr;
1489 pAd->ChannelList[j].DfsReq = pChDesp->DfsReq;
1490 j++;
1492 pAd->ChannelListNum = j;
1494 return j;
1497 static inline void CreateChList(struct rt_rtmp_adapter *pAd,
1498 struct rt_ch_region *pChRegion, u8 Geography)
1500 int i;
1501 u8 offset = 0;
1502 struct rt_ch_desp *pChDesp;
1503 u8 ChType;
1504 u8 increment;
1506 if (pChRegion == NULL)
1507 return;
1509 ChBandCheck(pAd->CommonCfg.PhyMode, &ChType);
1511 for (i = 0; i < 10; i++) {
1512 pChDesp = &pChRegion->ChDesp[i];
1513 if (pChDesp->FirstChannel == 0)
1514 break;
1516 if (ChType == BAND_5G) {
1517 if (pChDesp->FirstChannel <= 14)
1518 continue;
1519 } else if (ChType == BAND_24G) {
1520 if (pChDesp->FirstChannel > 14)
1521 continue;
1524 if ((pChDesp->Geography == BOTH)
1525 || (pChDesp->Geography == Geography)) {
1526 if (pChDesp->FirstChannel > 14)
1527 increment = 4;
1528 else
1529 increment = 1;
1530 offset = FillChList(pAd, pChDesp, offset, increment);
1535 void BuildChannelListEx(struct rt_rtmp_adapter *pAd)
1537 struct rt_ch_region *pChReg;
1539 pChReg = GetChRegion(pAd->CommonCfg.CountryCode);
1540 CreateChList(pAd, pChReg, pAd->CommonCfg.Geography);
1543 void BuildBeaconChList(struct rt_rtmp_adapter *pAd,
1544 u8 *pBuf, unsigned long *pBufLen)
1546 int i;
1547 unsigned long TmpLen;
1548 struct rt_ch_region *pChRegion;
1549 struct rt_ch_desp *pChDesp;
1550 u8 ChType;
1552 pChRegion = GetChRegion(pAd->CommonCfg.CountryCode);
1554 if (pChRegion == NULL)
1555 return;
1557 ChBandCheck(pAd->CommonCfg.PhyMode, &ChType);
1558 *pBufLen = 0;
1560 for (i = 0; i < 10; i++) {
1561 pChDesp = &pChRegion->ChDesp[i];
1562 if (pChDesp->FirstChannel == 0)
1563 break;
1565 if (ChType == BAND_5G) {
1566 if (pChDesp->FirstChannel <= 14)
1567 continue;
1568 } else if (ChType == BAND_24G) {
1569 if (pChDesp->FirstChannel > 14)
1570 continue;
1573 if ((pChDesp->Geography == BOTH)
1574 || (pChDesp->Geography == pAd->CommonCfg.Geography)) {
1575 MakeOutgoingFrame(pBuf + *pBufLen, &TmpLen,
1576 1, &pChDesp->FirstChannel,
1577 1, &pChDesp->NumOfCh,
1578 1, &pChDesp->MaxTxPwr, END_OF_ARGS);
1579 *pBufLen += TmpLen;
1584 static BOOLEAN IsValidChannel(struct rt_rtmp_adapter *pAd, u8 channel)
1586 int i;
1588 for (i = 0; i < pAd->ChannelListNum; i++) {
1589 if (pAd->ChannelList[i].Channel == channel)
1590 break;
1593 if (i == pAd->ChannelListNum)
1594 return FALSE;
1595 else
1596 return TRUE;
1599 static u8 GetExtCh(u8 Channel, u8 Direction)
1601 char ExtCh;
1603 if (Direction == EXTCHA_ABOVE)
1604 ExtCh = Channel + 4;
1605 else
1606 ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0;
1608 return ExtCh;
1611 void N_ChannelCheck(struct rt_rtmp_adapter *pAd)
1613 /*u8 ChannelNum = pAd->ChannelListNum; */
1614 u8 Channel = pAd->CommonCfg.Channel;
1616 if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
1617 && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)) {
1618 if (Channel > 14) {
1619 if ((Channel == 36) || (Channel == 44)
1620 || (Channel == 52) || (Channel == 60)
1621 || (Channel == 100) || (Channel == 108)
1622 || (Channel == 116) || (Channel == 124)
1623 || (Channel == 132) || (Channel == 149)
1624 || (Channel == 157)) {
1625 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA =
1626 EXTCHA_ABOVE;
1627 } else if ((Channel == 40) || (Channel == 48)
1628 || (Channel == 56) || (Channel == 64)
1629 || (Channel == 104) || (Channel == 112)
1630 || (Channel == 120) || (Channel == 128)
1631 || (Channel == 136) || (Channel == 153)
1632 || (Channel == 161)) {
1633 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA =
1634 EXTCHA_BELOW;
1635 } else {
1636 pAd->CommonCfg.RegTransmitSetting.field.BW =
1637 BW_20;
1639 } else {
1640 do {
1641 u8 ExtCh;
1642 u8 Dir =
1643 pAd->CommonCfg.RegTransmitSetting.field.
1644 EXTCHA;
1645 ExtCh = GetExtCh(Channel, Dir);
1646 if (IsValidChannel(pAd, ExtCh))
1647 break;
1649 Dir =
1650 (Dir ==
1651 EXTCHA_ABOVE) ? EXTCHA_BELOW :
1652 EXTCHA_ABOVE;
1653 ExtCh = GetExtCh(Channel, Dir);
1654 if (IsValidChannel(pAd, ExtCh)) {
1655 pAd->CommonCfg.RegTransmitSetting.field.
1656 EXTCHA = Dir;
1657 break;
1659 pAd->CommonCfg.RegTransmitSetting.field.BW =
1660 BW_20;
1661 } while (FALSE);
1663 if (Channel == 14) {
1664 pAd->CommonCfg.RegTransmitSetting.field.BW =
1665 BW_20;
1666 /*pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_NONE; // We didn't set the ExtCh as NONE due to it'll set in RTMPSetHT() */
1673 void N_SetCenCh(struct rt_rtmp_adapter *pAd)
1675 if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) {
1676 if (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA ==
1677 EXTCHA_ABOVE) {
1678 pAd->CommonCfg.CentralChannel =
1679 pAd->CommonCfg.Channel + 2;
1680 } else {
1681 if (pAd->CommonCfg.Channel == 14)
1682 pAd->CommonCfg.CentralChannel =
1683 pAd->CommonCfg.Channel - 1;
1684 else
1685 pAd->CommonCfg.CentralChannel =
1686 pAd->CommonCfg.Channel - 2;
1688 } else {
1689 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
1693 u8 GetCuntryMaxTxPwr(struct rt_rtmp_adapter *pAd, u8 channel)
1695 int i;
1696 for (i = 0; i < pAd->ChannelListNum; i++) {
1697 if (pAd->ChannelList[i].Channel == channel)
1698 break;
1701 if (i == pAd->ChannelListNum)
1702 return 0xff;
1703 else
1704 return pAd->ChannelList[i].MaxTxPwr;