/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * ************************************************************************* */ #include "../rt_config.h" CH_FREQ_MAP CH_HZ_ID_MAP[]= { {1, 2412}, {2, 2417}, {3, 2422}, {4, 2427}, {5, 2432}, {6, 2437}, {7, 2442}, {8, 2447}, {9, 2452}, {10, 2457}, {11, 2462}, {12, 2467}, {13, 2472}, {14, 2484}, /* UNII */ {36, 5180}, {40, 5200}, {44, 5220}, {48, 5240}, {52, 5260}, {56, 5280}, {60, 5300}, {64, 5320}, {149, 5745}, {153, 5765}, {157, 5785}, {161, 5805}, {165, 5825}, {167, 5835}, {169, 5845}, {171, 5855}, {173, 5865}, /* HiperLAN2 */ {100, 5500}, {104, 5520}, {108, 5540}, {112, 5560}, {116, 5580}, {120, 5600}, {124, 5620}, {128, 5640}, {132, 5660}, {136, 5680}, {140, 5700}, /* Japan MMAC */ {34, 5170}, {38, 5190}, {42, 5210}, {46, 5230}, /* Japan */ {184, 4920}, {188, 4940}, {192, 4960}, {196, 4980}, {208, 5040}, /* Japan, means J08 */ {212, 5060}, /* Japan, means J12 */ {216, 5080}, /* Japan, means J16 */ }; INT CH_HZ_ID_MAP_NUM = (sizeof(CH_HZ_ID_MAP)/sizeof(CH_FREQ_MAP)); CH_REGION ChRegion[] = { { // Antigua and Berbuda "AG", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 { 0}, // end } }, { // Argentina "AR", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Aruba "AW", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 { 0}, // end } }, { // Australia "AU", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // Austria "AT", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, TRUE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Bahamas "BS", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // Barbados "BB", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 { 0}, // end } }, { // Bermuda "BM", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 { 0}, // end } }, { // Brazil "BR", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 24, BOTH, FALSE}, // 5G, ch 100~140 { 149, 5, 30, BOTH, FALSE}, // 5G, ch 100~140 { 0}, // end } }, { // Belgium "BE", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 18, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 18, IDOR, FALSE}, // 5G, ch 52~64 { 0}, // end } }, { // Bulgaria "BG", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, ODOR, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Canada "CA", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // Cayman IsLands "KY", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 { 0}, // end } }, { // Chile "CL", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 20, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 20, BOTH, FALSE}, // 5G, ch 52~64 { 149, 5, 20, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // China "CN", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Colombia "CO", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // Costa Rica "CR", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Cyprus "CY", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 24, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Czech_Republic "CZ", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 0}, // end } }, { // Denmark "DK", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Dominican Republic "DO", CE, { { 1, 0, 20, BOTH, FALSE}, // 2.4 G, ch 0 { 149, 4, 20, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Equador "EC", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 100, 11, 27, BOTH, FALSE}, // 5G, ch 100~140 { 0}, // end } }, { // El Salvador "SV", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 30, BOTH, TRUE}, // 5G, ch 52~64 { 149, 4, 36, BOTH, TRUE}, // 5G, ch 149~165 { 0}, // end } }, { // Finland "FI", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // France "FR", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 0}, // end } }, { // Germany "DE", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Greece "GR", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, ODOR, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Guam "GU", CE, { { 1, 11, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // Guatemala "GT", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Haiti "HT", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Honduras "HN", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Hong Kong "HK", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, FALSE}, // 5G, ch 52~64 { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Hungary "HU", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 0}, // end } }, { // Iceland "IS", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // India "IN", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 149, 4, 24, IDOR, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Indonesia "ID", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Ireland "IE", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, ODOR, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Israel "IL", CE, { { 1, 3, 20, IDOR, FALSE}, // 2.4 G, ch 1~3 { 4, 6, 20, BOTH, FALSE}, // 2.4 G, ch 4~9 { 10, 4, 20, IDOR, FALSE}, // 2.4 G, ch 10~13 { 0}, // end } }, { // Italy "IT", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, ODOR, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Japan "JP", JAP, { { 1, 14, 20, BOTH, FALSE}, // 2.4 G, ch 1~14 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 0}, // end } }, { // Jordan "JO", CE, { { 1, 13, 20, IDOR, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 149, 4, 23, IDOR, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Latvia "LV", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Liechtenstein "LI", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Lithuania "LT", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Luxemburg "LU", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Malaysia "MY", CE, { { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 { 149, 5, 20, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // Malta "MT", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Marocco "MA", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 24, IDOR, FALSE}, // 5G, ch 36~48 { 0}, // end } }, { // Mexico "MX", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 149, 5, 30, IDOR, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // Netherlands "NL", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 24, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // New Zealand "NZ", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 24, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Norway "NO", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 24, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 24, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 149~161 { 0}, // end } }, { // Peru "PE", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Portugal "PT", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Poland "PL", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Romania "RO", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Russia "RU", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 149, 4, 20, IDOR, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Saudi Arabia "SA", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 { 149, 4, 23, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Serbia_and_Montenegro "CS", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 0}, // end } }, { // Singapore "SG", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 { 149, 4, 20, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Slovakia "SK", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Slovenia "SI", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 0}, // end } }, { // South Africa "ZA", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, FALSE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // South Korea "KR", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 20, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 20, BOTH, FALSE}, // 5G, ch 52~64 { 100, 8, 20, BOTH, FALSE}, // 5G, ch 100~128 { 149, 4, 20, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Spain "ES", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 17, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Sweden "SE", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Switzerland "CH", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 { 36, 4, 23, IDOR, TRUE}, // 5G, ch 36~48 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 0}, // end } }, { // Taiwan "TW", CE, { { 1, 11, 30, BOTH, FALSE}, // 2.4 G, ch 1~11 { 52, 4, 23, IDOR, FALSE}, // 5G, ch 52~64 { 0}, // end } }, { // Turkey "TR", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 { 0}, // end } }, { // UK "GB", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 { 36, 4, 23, IDOR, FALSE}, // 5G, ch 52~64 { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 0}, // end } }, { // Ukraine "UA", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 { 0}, // end } }, { // United_Arab_Emirates "AE", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 { 0}, // end } }, { // United_States "US", CE, { { 1, 11, 30, BOTH, FALSE}, // 2.4 G, ch 1~11 { 36, 4, 17, IDOR, FALSE}, // 5G, ch 52~64 { 52, 4, 24, BOTH, TRUE}, // 5G, ch 52~64 { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, { // Venezuela "VE", CE, { { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 { 0}, // end } }, { // Default "", CE, { { 1, 11, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 { 36, 4, 20, BOTH, FALSE}, // 5G, ch 52~64 { 52, 4, 20, BOTH, FALSE}, // 5G, ch 52~64 { 100, 11, 20, BOTH, FALSE}, // 5G, ch 100~140 { 149, 5, 20, BOTH, FALSE}, // 5G, ch 149~165 { 0}, // end } }, }; static PCH_REGION GetChRegion( IN PUCHAR CntryCode) { INT loop = 0; PCH_REGION pChRegion = NULL; while (strcmp((PSTRING) ChRegion[loop].CountReg, "") != 0) { if (strncmp((PSTRING) ChRegion[loop].CountReg, (PSTRING) CntryCode, 2) == 0) { pChRegion = &ChRegion[loop]; break; } loop++; } if (pChRegion == NULL) pChRegion = &ChRegion[loop]; return pChRegion; } static VOID ChBandCheck( IN UCHAR PhyMode, OUT PUCHAR pChType) { switch(PhyMode) { case PHY_11A: #ifdef DOT11_N_SUPPORT case PHY_11AN_MIXED: #endif // DOT11_N_SUPPORT // *pChType = BAND_5G; break; case PHY_11ABG_MIXED: #ifdef DOT11_N_SUPPORT case PHY_11AGN_MIXED: case PHY_11ABGN_MIXED: #endif // DOT11_N_SUPPORT // *pChType = BAND_BOTH; break; default: *pChType = BAND_24G; break; } } static UCHAR FillChList( IN PRTMP_ADAPTER pAd, IN PCH_DESP pChDesp, IN UCHAR Offset, IN UCHAR increment) { INT i, j, l; UCHAR channel; j = Offset; for (i = 0; i < pChDesp->NumOfCh; i++) { channel = pChDesp->FirstChannel + i * increment; for (l=0; lTxPower[l].Channel) { pAd->ChannelList[j].Power = pAd->TxPower[l].Power; pAd->ChannelList[j].Power2 = pAd->TxPower[l].Power2; break; } } if (l == MAX_NUM_OF_CHANNELS) continue; pAd->ChannelList[j].Channel = pChDesp->FirstChannel + i * increment; pAd->ChannelList[j].MaxTxPwr = pChDesp->MaxTxPwr; pAd->ChannelList[j].DfsReq = pChDesp->DfsReq; j++; } pAd->ChannelListNum = j; return j; } static inline VOID CreateChList( IN PRTMP_ADAPTER pAd, IN PCH_REGION pChRegion, IN UCHAR Geography) { INT i; UCHAR offset = 0; PCH_DESP pChDesp; UCHAR ChType; UCHAR increment; if (pChRegion == NULL) return; ChBandCheck(pAd->CommonCfg.PhyMode, &ChType); for (i=0; i<10; i++) { pChDesp = &pChRegion->ChDesp[i]; if (pChDesp->FirstChannel == 0) break; if (ChType == BAND_5G) { if (pChDesp->FirstChannel <= 14) continue; } else if (ChType == BAND_24G) { if (pChDesp->FirstChannel > 14) continue; } if ((pChDesp->Geography == BOTH) || (pChDesp->Geography == Geography)) { if (pChDesp->FirstChannel > 14) increment = 4; else increment = 1; offset = FillChList(pAd, pChDesp, offset, increment); } } } VOID BuildChannelListEx( IN PRTMP_ADAPTER pAd) { PCH_REGION pChReg; pChReg = GetChRegion(pAd->CommonCfg.CountryCode); CreateChList(pAd, pChReg, pAd->CommonCfg.Geography); } VOID BuildBeaconChList( IN PRTMP_ADAPTER pAd, OUT PUCHAR pBuf, OUT PULONG pBufLen) { INT i; ULONG TmpLen; PCH_REGION pChRegion; PCH_DESP pChDesp; UCHAR ChType; pChRegion = GetChRegion(pAd->CommonCfg.CountryCode); if (pChRegion == NULL) return; ChBandCheck(pAd->CommonCfg.PhyMode, &ChType); *pBufLen = 0; for (i=0; i<10; i++) { pChDesp = &pChRegion->ChDesp[i]; if (pChDesp->FirstChannel == 0) break; if (ChType == BAND_5G) { if (pChDesp->FirstChannel <= 14) continue; } else if (ChType == BAND_24G) { if (pChDesp->FirstChannel > 14) continue; } if ((pChDesp->Geography == BOTH) || (pChDesp->Geography == pAd->CommonCfg.Geography)) { MakeOutgoingFrame(pBuf + *pBufLen, &TmpLen, 1, &pChDesp->FirstChannel, 1, &pChDesp->NumOfCh, 1, &pChDesp->MaxTxPwr, END_OF_ARGS); *pBufLen += TmpLen; } } } #ifdef DOT11_N_SUPPORT static BOOLEAN IsValidChannel( IN PRTMP_ADAPTER pAd, IN UCHAR channel) { INT i; for (i = 0; i < pAd->ChannelListNum; i++) { if (pAd->ChannelList[i].Channel == channel) break; } if (i == pAd->ChannelListNum) return FALSE; else return TRUE; } static UCHAR GetExtCh( IN UCHAR Channel, IN UCHAR Direction) { CHAR ExtCh; if (Direction == EXTCHA_ABOVE) ExtCh = Channel + 4; else ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0; return ExtCh; } VOID N_ChannelCheck( IN PRTMP_ADAPTER pAd) { //UCHAR ChannelNum = pAd->ChannelListNum; UCHAR Channel = pAd->CommonCfg.Channel; if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)) { if (Channel > 14) { if ((Channel == 36) || (Channel == 44) || (Channel == 52) || (Channel == 60) || (Channel == 100) || (Channel == 108) || (Channel == 116) || (Channel == 124) || (Channel == 132) || (Channel == 149) || (Channel == 157)) { pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE; } else if ((Channel == 40) || (Channel == 48) || (Channel == 56) || (Channel == 64) || (Channel == 104) || (Channel == 112) || (Channel == 120) || (Channel == 128) || (Channel == 136) || (Channel == 153) || (Channel == 161)) { pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW; } else { pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; } } else { do { UCHAR ExtCh; UCHAR Dir = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA; ExtCh = GetExtCh(Channel, Dir); if (IsValidChannel(pAd, ExtCh)) break; Dir = (Dir == EXTCHA_ABOVE) ? EXTCHA_BELOW : EXTCHA_ABOVE; ExtCh = GetExtCh(Channel, Dir); if (IsValidChannel(pAd, ExtCh)) { pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = Dir; break; } pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; } while(FALSE); if (Channel == 14) { pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; //pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_NONE; // We didn't set the ExtCh as NONE due to it'll set in RTMPSetHT() } } } } VOID N_SetCenCh( IN PRTMP_ADAPTER pAd) { if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) { if (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE) { pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2; } else { if (pAd->CommonCfg.Channel == 14) pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 1; else pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2; } } else { pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; } } #endif // DOT11_N_SUPPORT // UINT8 GetCuntryMaxTxPwr( IN PRTMP_ADAPTER pAd, IN UINT8 channel) { int i; for (i = 0; i < pAd->ChannelListNum; i++) { if (pAd->ChannelList[i].Channel == channel) break; } if (i == pAd->ChannelListNum) return 0xff; else return pAd->ChannelList[i].MaxTxPwr; }