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;