diff options
Diffstat (limited to 'drivers/staging/rt2860/common/rt_channel.c')
-rw-r--r-- | drivers/staging/rt2860/common/rt_channel.c | 1705 |
1 files changed, 1705 insertions, 0 deletions
diff --git a/drivers/staging/rt2860/common/rt_channel.c b/drivers/staging/rt2860/common/rt_channel.c new file mode 100644 index 00000000000..53879898117 --- /dev/null +++ b/drivers/staging/rt2860/common/rt_channel.c @@ -0,0 +1,1705 @@ +/* + ************************************************************************* + * 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" + +struct rt_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(struct rt_ch_freq_map)); + +struct rt_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 struct rt_ch_region *GetChRegion(u8 *CntryCode) +{ + int loop = 0; + struct rt_ch_region *pChRegion = NULL; + + while (strcmp((char *)ChRegion[loop].CountReg, "") != 0) { + if (strncmp + ((char *)ChRegion[loop].CountReg, (char *)CntryCode, + 2) == 0) { + pChRegion = &ChRegion[loop]; + break; + } + loop++; + } + + if (pChRegion == NULL) + pChRegion = &ChRegion[loop]; + return pChRegion; +} + +static void ChBandCheck(u8 PhyMode, u8 *pChType) +{ + switch (PhyMode) { + case PHY_11A: + case PHY_11AN_MIXED: + *pChType = BAND_5G; + break; + case PHY_11ABG_MIXED: + case PHY_11AGN_MIXED: + case PHY_11ABGN_MIXED: + *pChType = BAND_BOTH; + break; + + default: + *pChType = BAND_24G; + break; + } +} + +static u8 FillChList(struct rt_rtmp_adapter *pAd, + struct rt_ch_desp *pChDesp, + u8 Offset, u8 increment) +{ + int i, j, l; + u8 channel; + + j = Offset; + for (i = 0; i < pChDesp->NumOfCh; i++) { + channel = pChDesp->FirstChannel + i * increment; + for (l = 0; l < MAX_NUM_OF_CHANNELS; l++) { + if (channel == pAd->TxPower[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(struct rt_rtmp_adapter *pAd, + struct rt_ch_region *pChRegion, u8 Geography) +{ + int i; + u8 offset = 0; + struct rt_ch_desp *pChDesp; + u8 ChType; + u8 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(struct rt_rtmp_adapter *pAd) +{ + struct rt_ch_region *pChReg; + + pChReg = GetChRegion(pAd->CommonCfg.CountryCode); + CreateChList(pAd, pChReg, pAd->CommonCfg.Geography); +} + +void BuildBeaconChList(struct rt_rtmp_adapter *pAd, + u8 *pBuf, unsigned long *pBufLen) +{ + int i; + unsigned long TmpLen; + struct rt_ch_region *pChRegion; + struct rt_ch_desp *pChDesp; + u8 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; + } + } +} + +static BOOLEAN IsValidChannel(struct rt_rtmp_adapter *pAd, u8 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 u8 GetExtCh(u8 Channel, u8 Direction) +{ + char ExtCh; + + if (Direction == EXTCHA_ABOVE) + ExtCh = Channel + 4; + else + ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0; + + return ExtCh; +} + +void N_ChannelCheck(struct rt_rtmp_adapter *pAd) +{ + /*u8 ChannelNum = pAd->ChannelListNum; */ + u8 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 { + u8 ExtCh; + u8 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(struct rt_rtmp_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; + } +} + +u8 GetCuntryMaxTxPwr(struct rt_rtmp_adapter *pAd, u8 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; +} |