2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
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. *
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. *
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. *
25 *************************************************************************
27 #include "../rt_config.h"
29 struct rt_ch_freq_map CH_HZ_ID_MAP
[] = {
140 , /* Japan, means J08 */
142 , /* Japan, means J12 */
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 */
154 {1, 13, 20, BOTH
, FALSE
}
155 , /* 2.4 G, ch 1~13 */
156 {36, 4, 23, BOTH
, FALSE
}
158 {52, 4, 23, BOTH
, FALSE
}
160 {100, 11, 30, BOTH
, FALSE
}
161 , /* 5G, ch 100~140 */
172 {1, 13, 20, BOTH
, FALSE
}
173 , /* 2.4 G, ch 1~13 */
174 {52, 4, 24, BOTH
, FALSE
}
176 {149, 4, 30, BOTH
, FALSE
}
177 , /* 5G, ch 149~161 */
188 {1, 13, 20, BOTH
, FALSE
}
189 , /* 2.4 G, ch 1~13 */
190 {36, 4, 23, BOTH
, FALSE
}
192 {52, 4, 23, BOTH
, FALSE
}
194 {100, 11, 30, BOTH
, FALSE
}
195 , /* 5G, ch 100~140 */
206 {1, 13, 20, BOTH
, FALSE
}
207 , /* 2.4 G, ch 1~13 */
208 {36, 4, 23, BOTH
, FALSE
}
210 {52, 4, 24, BOTH
, FALSE
}
212 {149, 5, 30, BOTH
, FALSE
}
213 , /* 5G, ch 149~165 */
224 {1, 13, 20, BOTH
, FALSE
}
225 , /* 2.4 G, ch 1~13 */
226 {36, 4, 23, IDOR
, TRUE
}
228 {52, 4, 23, IDOR
, TRUE
}
230 {100, 11, 30, BOTH
, TRUE
}
231 , /* 5G, ch 100~140 */
242 {1, 13, 20, BOTH
, FALSE
}
243 , /* 2.4 G, ch 1~13 */
244 {36, 4, 23, BOTH
, FALSE
}
246 {52, 4, 24, BOTH
, FALSE
}
248 {149, 5, 30, BOTH
, FALSE
}
249 , /* 5G, ch 149~165 */
260 {1, 13, 20, BOTH
, FALSE
}
261 , /* 2.4 G, ch 1~13 */
262 {36, 4, 23, BOTH
, FALSE
}
264 {52, 4, 24, BOTH
, FALSE
}
266 {100, 11, 30, BOTH
, FALSE
}
267 , /* 5G, ch 100~140 */
278 {1, 13, 20, BOTH
, FALSE
}
279 , /* 2.4 G, ch 1~13 */
280 {36, 4, 23, BOTH
, FALSE
}
282 {52, 4, 24, BOTH
, FALSE
}
284 {100, 11, 30, BOTH
, FALSE
}
285 , /* 5G, ch 100~140 */
296 {1, 13, 20, BOTH
, FALSE
}
297 , /* 2.4 G, ch 1~13 */
298 {36, 4, 23, BOTH
, FALSE
}
300 {52, 4, 24, BOTH
, FALSE
}
302 {100, 11, 24, BOTH
, FALSE
}
303 , /* 5G, ch 100~140 */
304 {149, 5, 30, BOTH
, FALSE
}
305 , /* 5G, ch 100~140 */
316 {1, 13, 20, BOTH
, FALSE
}
317 , /* 2.4 G, ch 1~13 */
318 {36, 4, 18, IDOR
, FALSE
}
320 {52, 4, 18, IDOR
, FALSE
}
332 {1, 13, 20, BOTH
, FALSE
}
333 , /* 2.4 G, ch 1~13 */
334 {36, 4, 23, IDOR
, FALSE
}
336 {52, 4, 23, IDOR
, TRUE
}
338 {100, 11, 30, ODOR
, TRUE
}
339 , /* 5G, ch 100~140 */
350 {1, 13, 20, BOTH
, FALSE
}
351 , /* 2.4 G, ch 1~13 */
352 {36, 4, 23, BOTH
, FALSE
}
354 {52, 4, 23, BOTH
, FALSE
}
356 {149, 5, 30, BOTH
, FALSE
}
357 , /* 5G, ch 149~165 */
364 { /* Cayman IsLands */
368 {1, 13, 20, BOTH
, FALSE
}
369 , /* 2.4 G, ch 1~13 */
370 {36, 4, 23, BOTH
, FALSE
}
372 {52, 4, 24, BOTH
, FALSE
}
374 {100, 11, 30, BOTH
, FALSE
}
375 , /* 5G, ch 100~140 */
386 {1, 13, 20, BOTH
, FALSE
}
387 , /* 2.4 G, ch 1~13 */
388 {36, 4, 20, BOTH
, FALSE
}
390 {52, 4, 20, BOTH
, FALSE
}
392 {149, 5, 20, BOTH
, FALSE
}
393 , /* 5G, ch 149~165 */
404 {1, 13, 20, BOTH
, FALSE
}
405 , /* 2.4 G, ch 1~13 */
406 {149, 4, 27, BOTH
, FALSE
}
407 , /* 5G, ch 149~161 */
418 {1, 13, 20, BOTH
, FALSE
}
419 , /* 2.4 G, ch 1~13 */
420 {36, 4, 17, BOTH
, FALSE
}
422 {52, 4, 24, BOTH
, FALSE
}
424 {100, 11, 30, BOTH
, FALSE
}
425 , /* 5G, ch 100~140 */
426 {149, 5, 30, BOTH
, FALSE
}
427 , /* 5G, ch 149~165 */
438 {1, 13, 20, BOTH
, FALSE
}
439 , /* 2.4 G, ch 1~13 */
440 {36, 4, 17, BOTH
, FALSE
}
442 {52, 4, 24, BOTH
, FALSE
}
444 {149, 4, 30, BOTH
, FALSE
}
445 , /* 5G, ch 149~161 */
456 {1, 13, 20, BOTH
, FALSE
}
457 , /* 2.4 G, ch 1~13 */
458 {36, 4, 23, IDOR
, FALSE
}
460 {52, 4, 24, IDOR
, TRUE
}
462 {100, 11, 30, BOTH
, TRUE
}
463 , /* 5G, ch 100~140 */
470 { /* Czech_Republic */
474 {1, 13, 20, BOTH
, FALSE
}
475 , /* 2.4 G, ch 1~13 */
476 {36, 4, 23, IDOR
, FALSE
}
478 {52, 4, 23, IDOR
, TRUE
}
490 {1, 13, 20, BOTH
, FALSE
}
491 , /* 2.4 G, ch 1~13 */
492 {36, 4, 23, IDOR
, FALSE
}
494 {52, 4, 23, IDOR
, TRUE
}
496 {100, 11, 30, BOTH
, TRUE
}
497 , /* 5G, ch 100~140 */
504 { /* Dominican Republic */
508 {1, 0, 20, BOTH
, FALSE
}
510 {149, 4, 20, BOTH
, FALSE
}
511 , /* 5G, ch 149~161 */
522 {1, 13, 20, BOTH
, FALSE
}
523 , /* 2.4 G, ch 1~13 */
524 {100, 11, 27, BOTH
, FALSE
}
525 , /* 5G, ch 100~140 */
536 {1, 13, 20, BOTH
, FALSE
}
537 , /* 2.4 G, ch 1~13 */
538 {36, 4, 23, IDOR
, FALSE
}
540 {52, 4, 30, BOTH
, TRUE
}
542 {149, 4, 36, BOTH
, TRUE
}
543 , /* 5G, ch 149~165 */
554 {1, 13, 20, BOTH
, FALSE
}
555 , /* 2.4 G, ch 1~13 */
556 {36, 4, 23, IDOR
, FALSE
}
558 {52, 4, 23, IDOR
, TRUE
}
560 {100, 11, 30, BOTH
, TRUE
}
561 , /* 5G, ch 100~140 */
572 {1, 13, 20, BOTH
, FALSE
}
573 , /* 2.4 G, ch 1~13 */
574 {36, 4, 23, IDOR
, FALSE
}
576 {52, 4, 23, IDOR
, TRUE
}
588 {1, 13, 20, BOTH
, FALSE
}
589 , /* 2.4 G, ch 1~13 */
590 {36, 4, 23, IDOR
, FALSE
}
592 {52, 4, 23, IDOR
, TRUE
}
594 {100, 11, 30, BOTH
, TRUE
}
595 , /* 5G, ch 100~140 */
606 {1, 13, 20, BOTH
, FALSE
}
607 , /* 2.4 G, ch 1~13 */
608 {36, 4, 23, IDOR
, FALSE
}
610 {52, 4, 23, IDOR
, TRUE
}
612 {100, 11, 30, ODOR
, TRUE
}
613 , /* 5G, ch 100~140 */
624 {1, 11, 20, BOTH
, FALSE
}
625 , /* 2.4 G, ch 1~11 */
626 {36, 4, 17, BOTH
, FALSE
}
628 {52, 4, 24, BOTH
, FALSE
}
630 {100, 11, 30, BOTH
, FALSE
}
631 , /* 5G, ch 100~140 */
632 {149, 5, 30, BOTH
, FALSE
}
633 , /* 5G, ch 149~165 */
644 {1, 13, 20, BOTH
, FALSE
}
645 , /* 2.4 G, ch 1~13 */
646 {36, 4, 17, BOTH
, FALSE
}
648 {52, 4, 24, BOTH
, FALSE
}
650 {149, 4, 30, BOTH
, FALSE
}
651 , /* 5G, ch 149~161 */
662 {1, 13, 20, BOTH
, FALSE
}
663 , /* 2.4 G, ch 1~13 */
664 {36, 4, 17, BOTH
, FALSE
}
666 {52, 4, 24, BOTH
, FALSE
}
668 {149, 4, 30, BOTH
, FALSE
}
669 , /* 5G, ch 149~161 */
680 {1, 13, 20, BOTH
, FALSE
}
681 , /* 2.4 G, ch 1~13 */
682 {149, 4, 27, BOTH
, FALSE
}
683 , /* 5G, ch 149~161 */
694 {1, 13, 20, BOTH
, FALSE
}
695 , /* 2.4 G, ch 1~13 */
696 {36, 4, 23, IDOR
, FALSE
}
698 {52, 4, 23, IDOR
, FALSE
}
700 {149, 4, 30, BOTH
, FALSE
}
701 , /* 5G, ch 149~161 */
712 {1, 13, 20, BOTH
, FALSE
}
713 , /* 2.4 G, ch 1~13 */
714 {36, 4, 23, IDOR
, FALSE
}
716 {52, 4, 23, IDOR
, TRUE
}
728 {1, 13, 20, BOTH
, FALSE
}
729 , /* 2.4 G, ch 1~13 */
730 {36, 4, 23, IDOR
, FALSE
}
732 {52, 4, 23, IDOR
, TRUE
}
734 {100, 11, 30, BOTH
, TRUE
}
735 , /* 5G, ch 100~140 */
746 {1, 13, 20, BOTH
, FALSE
}
747 , /* 2.4 G, ch 1~13 */
748 {149, 4, 24, IDOR
, FALSE
}
749 , /* 5G, ch 149~161 */
760 {1, 13, 20, BOTH
, FALSE
}
761 , /* 2.4 G, ch 1~13 */
762 {149, 4, 27, BOTH
, FALSE
}
763 , /* 5G, ch 149~161 */
774 {1, 13, 20, BOTH
, FALSE
}
775 , /* 2.4 G, ch 1~13 */
776 {36, 4, 23, IDOR
, FALSE
}
778 {52, 4, 23, IDOR
, TRUE
}
780 {100, 11, 30, ODOR
, TRUE
}
781 , /* 5G, ch 100~140 */
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 */
808 {1, 13, 20, BOTH
, FALSE
}
809 , /* 2.4 G, ch 1~13 */
810 {36, 4, 23, IDOR
, FALSE
}
812 {52, 4, 23, IDOR
, TRUE
}
814 {100, 11, 30, ODOR
, TRUE
}
815 , /* 5G, ch 100~140 */
826 {1, 14, 20, BOTH
, FALSE
}
827 , /* 2.4 G, ch 1~14 */
828 {36, 4, 23, IDOR
, FALSE
}
840 {1, 13, 20, IDOR
, FALSE
}
841 , /* 2.4 G, ch 1~13 */
842 {36, 4, 23, IDOR
, FALSE
}
844 {149, 4, 23, IDOR
, FALSE
}
845 , /* 5G, ch 149~161 */
856 {1, 13, 20, BOTH
, FALSE
}
857 , /* 2.4 G, ch 1~13 */
858 {36, 4, 23, IDOR
, FALSE
}
860 {52, 4, 23, IDOR
, TRUE
}
862 {100, 11, 30, BOTH
, TRUE
}
863 , /* 5G, ch 100~140 */
870 { /* Liechtenstein */
874 {1, 13, 20, BOTH
, FALSE
}
875 , /* 2.4 G, ch 1~13 */
876 {52, 4, 23, IDOR
, TRUE
}
878 {100, 11, 30, BOTH
, TRUE
}
879 , /* 5G, ch 100~140 */
890 {1, 13, 20, BOTH
, FALSE
}
891 , /* 2.4 G, ch 1~13 */
892 {36, 4, 23, IDOR
, FALSE
}
894 {52, 4, 23, IDOR
, TRUE
}
896 {100, 11, 30, BOTH
, TRUE
}
897 , /* 5G, ch 100~140 */
908 {1, 13, 20, BOTH
, FALSE
}
909 , /* 2.4 G, ch 1~13 */
910 {36, 4, 23, IDOR
, FALSE
}
912 {52, 4, 23, IDOR
, TRUE
}
914 {100, 11, 30, BOTH
, TRUE
}
915 , /* 5G, ch 100~140 */
926 {36, 4, 23, BOTH
, FALSE
}
928 {52, 4, 23, BOTH
, FALSE
}
930 {149, 5, 20, BOTH
, FALSE
}
931 , /* 5G, ch 149~165 */
942 {1, 13, 20, BOTH
, FALSE
}
943 , /* 2.4 G, ch 1~13 */
944 {36, 4, 23, IDOR
, FALSE
}
946 {52, 4, 23, IDOR
, TRUE
}
948 {100, 11, 30, BOTH
, TRUE
}
949 , /* 5G, ch 100~140 */
960 {1, 13, 20, BOTH
, FALSE
}
961 , /* 2.4 G, ch 1~13 */
962 {36, 4, 24, IDOR
, FALSE
}
974 {1, 13, 20, BOTH
, FALSE
}
975 , /* 2.4 G, ch 1~13 */
976 {36, 4, 23, BOTH
, FALSE
}
978 {52, 4, 24, BOTH
, FALSE
}
980 {149, 5, 30, IDOR
, FALSE
}
981 , /* 5G, ch 149~165 */
992 {1, 13, 20, BOTH
, FALSE
}
993 , /* 2.4 G, ch 1~13 */
994 {36, 4, 23, IDOR
, FALSE
}
996 {52, 4, 24, IDOR
, TRUE
}
998 {100, 11, 30, BOTH
, TRUE
}
999 , /* 5G, ch 100~140 */
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 */
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 */
1046 {1, 13, 20, BOTH
, FALSE
}
1047 , /* 2.4 G, ch 1~13 */
1048 {149, 4, 27, BOTH
, FALSE
}
1049 , /* 5G, ch 149~161 */
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 */
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 */
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 */
1114 {1, 13, 20, BOTH
, FALSE
}
1115 , /* 2.4 G, ch 1~13 */
1116 {149, 4, 20, IDOR
, FALSE
}
1117 , /* 5G, ch 149~161 */
1124 { /* Saudi Arabia */
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 */
1142 { /* Serbia_and_Montenegro */
1146 {1, 13, 20, BOTH
, FALSE
}
1147 , /* 2.4 G, ch 1~13 */
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 */
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 */
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 */
1206 { /* South Africa */
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 */
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 */
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 */
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 */
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 */
1302 {1, 11, 30, BOTH
, FALSE
}
1303 , /* 2.4 G, ch 1~11 */
1304 {52, 4, 23, IDOR
, FALSE
}
1305 , /* 5G, ch 52~64 */
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 */
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 */
1350 {1, 13, 20, BOTH
, FALSE
}
1351 , /* 2.4 G, ch 1~11 */
1358 { /* United_Arab_Emirates */
1362 {1, 13, 20, BOTH
, FALSE
}
1363 , /* 2.4 G, ch 1~11 */
1370 { /* United_States */
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 */
1394 {1, 13, 20, BOTH
, FALSE
}
1395 , /* 2.4 G, ch 1~11 */
1396 {149, 4, 27, BOTH
, FALSE
}
1397 , /* 5G, ch 149~161 */
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 */
1425 static struct rt_ch_region
*GetChRegion(u8
*CntryCode
)
1428 struct rt_ch_region
*pChRegion
= NULL
;
1430 while (strcmp((char *)ChRegion
[loop
].CountReg
, "") != 0) {
1432 ((char *)ChRegion
[loop
].CountReg
, (char *)CntryCode
,
1434 pChRegion
= &ChRegion
[loop
];
1440 if (pChRegion
== NULL
)
1441 pChRegion
= &ChRegion
[loop
];
1445 static void ChBandCheck(u8 PhyMode
, u8
*pChType
)
1449 case PHY_11AN_MIXED
:
1452 case PHY_11ABG_MIXED
:
1453 case PHY_11AGN_MIXED
:
1454 case PHY_11ABGN_MIXED
:
1455 *pChType
= BAND_BOTH
;
1459 *pChType
= BAND_24G
;
1464 static u8
FillChList(struct rt_rtmp_adapter
*pAd
,
1465 struct rt_ch_desp
*pChDesp
,
1466 u8 Offset
, u8 increment
)
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
;
1483 if (l
== MAX_NUM_OF_CHANNELS
)
1486 pAd
->ChannelList
[j
].Channel
=
1487 pChDesp
->FirstChannel
+ i
* increment
;
1488 pAd
->ChannelList
[j
].MaxTxPwr
= pChDesp
->MaxTxPwr
;
1489 pAd
->ChannelList
[j
].DfsReq
= pChDesp
->DfsReq
;
1492 pAd
->ChannelListNum
= j
;
1497 static inline void CreateChList(struct rt_rtmp_adapter
*pAd
,
1498 struct rt_ch_region
*pChRegion
, u8 Geography
)
1502 struct rt_ch_desp
*pChDesp
;
1506 if (pChRegion
== NULL
)
1509 ChBandCheck(pAd
->CommonCfg
.PhyMode
, &ChType
);
1511 for (i
= 0; i
< 10; i
++) {
1512 pChDesp
= &pChRegion
->ChDesp
[i
];
1513 if (pChDesp
->FirstChannel
== 0)
1516 if (ChType
== BAND_5G
) {
1517 if (pChDesp
->FirstChannel
<= 14)
1519 } else if (ChType
== BAND_24G
) {
1520 if (pChDesp
->FirstChannel
> 14)
1524 if ((pChDesp
->Geography
== BOTH
)
1525 || (pChDesp
->Geography
== Geography
)) {
1526 if (pChDesp
->FirstChannel
> 14)
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
)
1547 unsigned long TmpLen
;
1548 struct rt_ch_region
*pChRegion
;
1549 struct rt_ch_desp
*pChDesp
;
1552 pChRegion
= GetChRegion(pAd
->CommonCfg
.CountryCode
);
1554 if (pChRegion
== NULL
)
1557 ChBandCheck(pAd
->CommonCfg
.PhyMode
, &ChType
);
1560 for (i
= 0; i
< 10; i
++) {
1561 pChDesp
= &pChRegion
->ChDesp
[i
];
1562 if (pChDesp
->FirstChannel
== 0)
1565 if (ChType
== BAND_5G
) {
1566 if (pChDesp
->FirstChannel
<= 14)
1568 } else if (ChType
== BAND_24G
) {
1569 if (pChDesp
->FirstChannel
> 14)
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
);
1584 static BOOLEAN
IsValidChannel(struct rt_rtmp_adapter
*pAd
, u8 channel
)
1588 for (i
= 0; i
< pAd
->ChannelListNum
; i
++) {
1589 if (pAd
->ChannelList
[i
].Channel
== channel
)
1593 if (i
== pAd
->ChannelListNum
)
1599 static u8
GetExtCh(u8 Channel
, u8 Direction
)
1603 if (Direction
== EXTCHA_ABOVE
)
1604 ExtCh
= Channel
+ 4;
1606 ExtCh
= (Channel
- 4) > 0 ? (Channel
- 4) : 0;
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
)) {
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
=
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
=
1636 pAd
->CommonCfg
.RegTransmitSetting
.field
.BW
=
1643 pAd
->CommonCfg
.RegTransmitSetting
.field
.
1645 ExtCh
= GetExtCh(Channel
, Dir
);
1646 if (IsValidChannel(pAd
, ExtCh
))
1651 EXTCHA_ABOVE
) ? EXTCHA_BELOW
:
1653 ExtCh
= GetExtCh(Channel
, Dir
);
1654 if (IsValidChannel(pAd
, ExtCh
)) {
1655 pAd
->CommonCfg
.RegTransmitSetting
.field
.
1659 pAd
->CommonCfg
.RegTransmitSetting
.field
.BW
=
1663 if (Channel
== 14) {
1664 pAd
->CommonCfg
.RegTransmitSetting
.field
.BW
=
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
==
1678 pAd
->CommonCfg
.CentralChannel
=
1679 pAd
->CommonCfg
.Channel
+ 2;
1681 if (pAd
->CommonCfg
.Channel
== 14)
1682 pAd
->CommonCfg
.CentralChannel
=
1683 pAd
->CommonCfg
.Channel
- 1;
1685 pAd
->CommonCfg
.CentralChannel
=
1686 pAd
->CommonCfg
.Channel
- 2;
1689 pAd
->CommonCfg
.CentralChannel
= pAd
->CommonCfg
.Channel
;
1693 u8
GetCuntryMaxTxPwr(struct rt_rtmp_adapter
*pAd
, u8 channel
)
1696 for (i
= 0; i
< pAd
->ChannelListNum
; i
++) {
1697 if (pAd
->ChannelList
[i
].Channel
== channel
)
1701 if (i
== pAd
->ChannelListNum
)
1704 return pAd
->ChannelList
[i
].MaxTxPwr
;