summaryrefslogtreecommitdiff
path: root/network/wlan/WDI/COMMON/Dot11d.c
diff options
context:
space:
mode:
authorDaiqian Hu <[email protected]>2016-11-21 08:54:24 +0800
committerDaiqian Hu <[email protected]>2016-11-21 08:54:24 +0800
commita95eaad088f61aa55da9d73015cf1ed86e64a67e (patch)
tree15b498a08a4aee4b7f8b1627d39c965b3aa3ba98 /network/wlan/WDI/COMMON/Dot11d.c
parent1aa0338ec5418345ea0c383e92b4fa19f7c98425 (diff)
Re-submit for WDI sample driver to GitHub
Submit WDI sample driver to GitHub for RS1.
Diffstat (limited to 'network/wlan/WDI/COMMON/Dot11d.c')
-rw-r--r--network/wlan/WDI/COMMON/Dot11d.c1881
1 files changed, 1881 insertions, 0 deletions
diff --git a/network/wlan/WDI/COMMON/Dot11d.c b/network/wlan/WDI/COMMON/Dot11d.c
new file mode 100644
index 00000000..9a415fc6
--- /dev/null
+++ b/network/wlan/WDI/COMMON/Dot11d.c
@@ -0,0 +1,1881 @@
+//-----------------------------------------------------------------------------
+// File:
+// Dot11d.c
+//
+// Description:
+// Implement 802.11d.
+//
+//-----------------------------------------------------------------------------
+
+#include "Mp_Precomp.h"
+
+#if WPP_SOFTWARE_TRACE
+#include "Dot11d.tmh"
+#endif
+
+/*------------------------ Private Funtion Declaration-------------------------------------*/
+// The following function are called only in Dot11d.c
+#define RtResetScanChannel(__pChannelList) \
+{ \
+ (__pChannelList)->ScanChannelListLength = 0; \
+ (__pChannelList)->ScanChannelIndex = 0; \
+}
+
+#define RtInsertScanChannel(__pChannelList, __pChnlListEntry) \
+{ \
+ if((__pChannelList)->ScanChannelListLength < MAX_SCAN_CHANNEL_NUM) \
+ { \
+ (__pChannelList)->ScanChannelList[(__pChannelList)->ScanChannelListLength ++] = \
+ (PRT_CHNL_LIST_ENTRY)(__pChnlListEntry); \
+ } \
+}
+
+#define RtGetScanChannel(__pChannelList) \
+ (((__pChannelList)->ScanChannelIndex >= (__pChannelList)->ScanChannelListLength) ? \
+ NULL : (__pChannelList)->ScanChannelList[(__pChannelList)->ScanChannelIndex])
+
+#define RtPopScanChannel(__pChannelList) \
+ (((__pChannelList)->ScanChannelIndex >= (__pChannelList)->ScanChannelListLength) ? \
+ NULL : (__pChannelList)->ScanChannelList[(__pChannelList)->ScanChannelIndex ++])
+
+
+#define RtResetChannelList(__pChannelList) \
+{ \
+ (__pChannelList)->ChannelPlan = RT_CHANNEL_DOMAIN_MAX; \
+ (__pChannelList)->bDot11d = FALSE; \
+ (__pChannelList)->ChannelLen = 0; \
+ (__pChannelList)->WirelessMode = WIRELESS_MODE_UNKNOWN; \
+ PlatformZeroMemory((__pChannelList)->ChnlListEntry, sizeof(RT_CHNL_LIST_ENTRY) * MAX_CHANNEL_NUM); \
+ RtResetScanChannel(__pChannelList); \
+}
+/*------------------------ End of Private Funtion Declaration------------------------------*/
+
+
+static u1Byte s_MaxChnlList[] = {
+ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,
+ 36,40,44,48,52,56,60,64,149,153,157,161,165
+};
+
+
+#define DOMAIN_CODE_2G_WORLD \
+ {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13
+#define DOMAIN_CODE_2G_ETSI1 \
+ {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13
+#define DOMAIN_CODE_2G_ETSI2 \
+ {1,2,3,4,5,6,7,8,9,10,11,12,13,14}, 14
+#define DOMAIN_CODE_2G_FCC1 \
+ {1,2,3,4,5,6,7,8,9,10,11}, 11
+#define DOMAIN_CODE_2G_MKK1 \
+ {1,2,3,4,5,6,7,8,9,10,11,12,13,14}, 14
+#define DOMAIN_CODE_2G_MKK2 \
+ {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13
+#define DOMAIN_CODE_2G_GLOBAL \
+ {1,2,3,4,5,6,7,8,9,10,11,12,13,14}, 14
+#define DOMAIN_CODE_2G_WHQL_WFD \
+ {1,4,6,8,11}, 5
+
+#define DOMAIN_CODE_5G_ETSI1 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19
+#define DOMAIN_CODE_5G_ETSI2 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24
+#define DOMAIN_CODE_5G_ETSI3 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,149,153,157,161,165}, 22
+#define DOMAIN_CODE_5G_ETSI4 \
+ {36,40,44,48}, 4
+#define DOMAIN_CODE_5G_ETSI5 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165}, 21
+#define DOMAIN_CODE_5G_ETSI6 \
+ {36,40,44,48,52,56,60,64}, 8
+#define DOMAIN_CODE_5G_ETSI7 \
+ {36,40,44,48,52,56,60,64,149,153,157,161,165}, 13
+#define DOMAIN_CODE_5G_ETSI8 \
+ {149,153,157,161}, 4
+#define DOMAIN_CODE_5G_ETSI9 \
+ {100,104,108,112,116,132,136,140}, 8
+#define DOMAIN_CODE_5G_ETSI10 \
+ {149,153,157,161,165}, 5
+#define DOMAIN_CODE_5G_ETSI11 \
+ {36,40,44,48,52,56,60,64,132,136,140,149,153,157,161,165}, 16
+#define DOMAIN_CODE_5G_ETSI12 \
+ {149,153,157,161}, 4
+#define DOMAIN_CODE_5G_ETSI13 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140}, 16
+#define DOMAIN_CODE_5G_ETSI14 \
+ {36,40,44,48,52,56,60,64,132,136,140}, 11
+
+#define DOMAIN_CODE_5G_FCC1 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24
+#define DOMAIN_CODE_5G_FCC2 \
+ {36,40,44,48,149,153,157,161,165}, 9
+#define DOMAIN_CODE_5G_FCC3 \
+ {36,40,44,48,52,56,60,64,149,153,157,161,165}, 13
+#define DOMAIN_CODE_5G_FCC4 \
+ {36,40,44,48,52,56,60,64,149,153,157,161}, 12
+#define DOMAIN_CODE_5G_FCC5 \
+ {149,153,157,161,165}, 5
+#define DOMAIN_CODE_5G_FCC6 \
+ {36,40,44,48,52,56,60,64}, 8
+#define DOMAIN_CODE_5G_FCC7 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165}, 21
+#define DOMAIN_CODE_5G_FCC8 \
+ {149,153,157,161}, 4
+#define DOMAIN_CODE_5G_FCC9 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165}, 21
+#define DOMAIN_CODE_5G_FCC10 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161}, 20
+
+#define DOMAIN_CODE_5G_IC1 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20
+
+#define DOMAIN_CODE_5G_KCC1 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161}, 19
+
+#define DOMAIN_CODE_5G_MKK1 \
+ {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19
+#define DOMAIN_CODE_5G_MKK2 \
+ {36,40,44,48,52,56,60,64}, 8
+#define DOMAIN_CODE_5G_MKK3 \
+ {100,104,108,112,116,120,124,128,132,136,140}, 11
+#define DOMAIN_CODE_5G_MKK4 \
+ {36,40,44,48}, 4
+
+#define DOMAIN_CODE_5G_NCC1 \
+ {56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165}, 16
+#define DOMAIN_CODE_5G_NCC2 \
+ {56,60,64,149,153,157,161,165}, 8
+#define DOMAIN_CODE_5G_NCC3 \
+ {149,153,157,161,165}, 5
+#define DOMAIN_CODE_5G_NCC4 \
+ {52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165}, 17
+#define DOMAIN_CODE_5G_WHQL_WFD \
+ {36,40,44,48,149,157,165}, 7
+#define UNDEFINED \
+ {0}, 0
+
+//
+// Note:
+// (1) I merge Default Channel Plan to here because I think channel plans are global defintions
+// which shall not depend on ICs or customized requests (ex. scan period, passive scan,
+// join actions, etc.). If the channel plans depend on the ICs, we should take care of the mp kits
+// for all ICs. And we take a large risk to maintain different channel plans for differnet ICs.
+// (2) We shall not add/modify the channel plans excpet when the channels in the channel plan
+// are different from the existing channel plan.
+// (3) All extra infomation about the channel plan for customized requests should not put into the
+// definitions of the DefaultChannelPlan, and instead, keep the information in the
+// RT_CHNL_LIST_ENTRY when we construct the RT_CHANNEL_LIST. To compatible with the
+// past customized requests, I merge old customized channel plan in the RtConstructChannelList().
+// By Bruce, 2008-09-01.
+//
+
+
+static RT_CHANNEL_PLAN DefaultChannelPlan[RT_CHANNEL_DOMAIN_MAX] = {
+#if (DFS_TEST_CHNL_PLAN == 1)
+ // The channel plan is for DFS test only.
+ //4 #00 EFUSE_00h: RT_CHANNEL_DOMAIN_FCC
+ {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,124,128,149,153,157,161,165} ,28, UNDEFINED, UNDEFINED},
+#else
+ //4 #00 EFUSE_00h: RT_CHANNEL_DOMAIN_FCC
+ {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165} ,35, UNDEFINED, UNDEFINED},
+#endif
+ //4 #01 EFUSE_01h: RT_CHANNEL_DOMAIN_IC
+ {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165} , 31, UNDEFINED, UNDEFINED},
+
+ //4 #02 EFUSE_02h: RT_CHANNEL_DOMAIN_ETSI
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,100,104,108,112,116,120,124,128,132,136,140} , 31, UNDEFINED, UNDEFINED},
+
+ //4 #03 EFUSE_03h: RT_CHANNEL_DOMAIN_SPAIN
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13} , 13, UNDEFINED, UNDEFINED},
+
+ //4 #04 EFUSE_04h: RT_CHANNEL_DOMAIN_FRANCE
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13} , 13, UNDEFINED, UNDEFINED},
+
+ //4 #05 EFUSE_05h: RT_CHANNEL_DOMAIN_MKK
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13} , 13, UNDEFINED, UNDEFINED},
+
+ //4 #06 EFUSE_06h: RT_CHANNEL_DOMAIN_MKK1
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13} , 13, UNDEFINED, UNDEFINED},
+
+ //4 #07 EFUSE_07h: RT_CHANNEL_DOMAIN_ISRAEL
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64} , 21, UNDEFINED, UNDEFINED},
+
+ //4 #08 EFUSE_08h: RT_CHANNEL_DOMAIN_TELEC
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64} , 22, UNDEFINED, UNDEFINED},
+
+ //4 #09 EFUSE_09h: RT_CHANNEL_DOMAIN_MIC
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64} , 21, UNDEFINED, UNDEFINED},
+
+ //4 #10 EFUSE_0Ah: RT_CHANNEL_DOMAIN_GLOBAL_DOMAIN
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,14} , 14, UNDEFINED, UNDEFINED},
+
+ //4 #11 EFUSE_0Bh: RT_CHANNEL_DOMAIN_WORLD_WIDE_13
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13} , 13, UNDEFINED, UNDEFINED},
+
+ //4 #12 EFUSE_0Ch: RT_CHANNEL_DOMAIN_TAIWAN
+ {{1,2,3,4,5,6,7,8,9,10,11,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165} , 26, UNDEFINED, UNDEFINED},
+
+ //4 #13 EFUSE_0Dh: RT_CHANNEL_DOMAIN_CHIAN
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,149,153,157,161,165} , 18, UNDEFINED, UNDEFINED},
+
+ //4 #14 EFUSE_0Eh: RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO
+ {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165} , 24, UNDEFINED, UNDEFINED},
+
+ //4 #15 EFUSE_0Fh: RT_CHANNEL_DOMAIN_KOREA
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165} , 33, UNDEFINED, UNDEFINED},
+
+ //4 #16 EFUSE_10h: RT_CHANNEL_DOMAIN_TURKEY
+ {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64} , 19, UNDEFINED, UNDEFINED},
+
+ //4 #17 EFUSE_11h: RT_CHANNEL_DOMAIN_JAPAN
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140} , 32, UNDEFINED, UNDEFINED},
+
+ //4 #18 EFUSE_12h: FCC_No_DFS
+ {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,149,153,157,161,165} , 20, UNDEFINED, UNDEFINED},
+
+ //4 #19 EFUSE_13h: Japan_No_DFS
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48} , 17, UNDEFINED, UNDEFINED},
+
+ //4 #20 EFUSE_14h: WORLD_WIDE_5G // RT_CHANNEL_DOMAIN_WORLD_WIDE_5G
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165} , 37, UNDEFINED, UNDEFINED},
+
+ //4 #21 Taiwan_No_DFS // RT_CHANNEL_DOMAIN_TAIWAN_NO_DFS
+ {{1,2,3,4,5,6,7,8,9,10,11,56,60,64,149,153,157,161,165},19, UNDEFINED, UNDEFINED},
+
+ //4 #22 EFUSE_16h Default 7F: RealtekReserved // RT_CHANNEL_DOMAIN_DEFAULT
+ // 2013/01/29 MH According to new definition from RF team, RTK default channel plan will support all CH.
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165},37, UNDEFINED, UNDEFINED},
+
+ //4 #23 EFUSE_17h OmniPeek-All-Channel (RT_CHANNEL_DOMAIN_OMNIPEEK_ALL_CHANNEL): 2.4G and 5G now
+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165},38, UNDEFINED, UNDEFINED},
+
+ //4 #24 RT_CHANNEL_DOMAIN_WHQL
+ {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,149,157,165} , 18, UNDEFINED, UNDEFINED},
+
+//1 ============= New definition supports 2.4G and 5G =============
+
+ // #25 EFUSE_20h: RT_CHANNEL_DOMAIN_WW13_2G 2.4G World Wide 13
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, UNDEFINED},
+
+ // #26 EFUSE_21h: RT_CHANNEL_DOMAIN_EUROPE_2G 2.4G Europe
+ {UNDEFINED, DOMAIN_CODE_2G_ETSI1, UNDEFINED},
+
+ // #27 EFUSE_22h: RT_CHANNEL_DOMAIN_US_2G 2.4G US
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, UNDEFINED},
+
+ // #28 EFUSE_23h: RT_CHANNEL_DOMAIN_JAPAN_2G 2.4G Japan
+ {UNDEFINED, DOMAIN_CODE_2G_MKK1, UNDEFINED},
+
+ // #29 EFUSE_24h: RT_CHANNEL_DOMAIN_FRANCE_2G 2.4G France
+ {UNDEFINED, DOMAIN_CODE_2G_ETSI2, UNDEFINED},
+
+ // #30 EFUSE_25h: RT_CHANNEL_DOMAIN_US_2G_5G 2.4G/5G US
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_FCC1},
+
+ // #31 EFUSE_26h: RT_CHANNEL_DOMAIN_WW13_2G_EUROPE_5G 2.4G World Wide 13 + 5G Europe
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI1},
+
+ // #32 EFUSE_27h: RT_CHANNEL_DOMAIN_JAPAN_2G_5G 2.4G/5G Japan
+ {UNDEFINED, DOMAIN_CODE_2G_MKK1, DOMAIN_CODE_5G_MKK1},
+
+ // #33 EFUSE_28h: RT_CHANNEL_DOMAIN_WW13_2G_KOREA_5G 2.4G World Wide 13 + 5G Korea
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_KCC1},
+
+ // #34 EFUSE_29h: RT_CHANNEL_DOMAIN_WW13_2G_US_5G 2.4G World Wide 13 + 5G US/DFS Channels
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_FCC2},
+
+ // #35 EFUSE_30h: RT_CHANNEL_DOMAIN_WW13_2G_INDIA_5G 2.4G World Wide 13 + 5G India/Mexico
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_FCC3},
+
+ // #36 EFUSE_31h: RT_CHANNEL_DOMAIN_WW13_2G_VENEZUELA_5G 2.4G World Wide 13 + 5G Venezuela
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_FCC4},
+
+ // #37 EFUSE_32h: RT_CHANNEL_DOMAIN_WW13_2G_CHINA_5G 2.4G World Wide 13 + 5G China
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_FCC5},
+
+ // #38 EFUSE_33h: RT_CHANNEL_DOMAIN_WW13_2G_ISRAEL_5G 2.4G World Wide 13 + 5G Israel
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_FCC6},
+
+ // #39 EFUSE_34h: RT_CHANNEL_DOMAIN_US_2G_CANADA_5G 2.4G US + 5G US/Canada
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_FCC7},
+
+ // #40 EFUSE_35h: RT_CHANNEL_DOMAIN_WW13_2G_AUSTRALIA_5G 2.4G World Wide 13 + 5G Australia/New Zealand
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI2},
+
+ // #41 EFUSE_36h: RT_CHANNEL_DOMAIN_WW13_2G_RUSSIA_5G 2.4G World Wide 13 + 5G Russia
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI3},
+
+ // #42 EFUSE_37h: RT_CHANNEL_DOMAIN_JAPAN_2G_W52_W53_5G 2.4G Japan + 5G Japan(W52, W53)
+ {UNDEFINED, DOMAIN_CODE_2G_MKK1, DOMAIN_CODE_5G_MKK2},
+
+ // #43 EFUSE_38h: RT_CHANNEL_DOMAIN_JAPAN_2G_W56_5G
+ {UNDEFINED, DOMAIN_CODE_2G_MKK1, DOMAIN_CODE_5G_MKK3},
+
+ // #44 EFUSE_39h: RT_CHANNEL_DOMAIN_US_2G_TAIWAN_5G
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_NCC1},
+
+ // #45 EFUSE_40h: RT_CHANNEL_DOMAIN_US_2G_TAIWAN_DFS_5G
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_NCC2},
+
+ // #46 EFUSE_41h: RT_CHANNEL_DOMAIN_GLOBAL_DOMAIN_2G
+ {UNDEFINED, DOMAIN_CODE_2G_GLOBAL, UNDEFINED},
+
+ // #47 EFUSE_42h: RT_CHANNEL_DOMAIN_2G_ETSI1_5G_ETSI4
+ {UNDEFINED, DOMAIN_CODE_2G_ETSI1, DOMAIN_CODE_5G_ETSI4},
+
+ // #48 EFUSE_43h: RT_CHANNEL_DOMAIN_2G_FCC1_5G_FCC2
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_FCC2},
+
+ // #49 EFUSE_44h: RT_CHANNEL_DOMAIN_2G_FCC1_5G_NCC3
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_NCC3},
+
+ // #50 EFUSE_45h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI5
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI5},
+
+ // #51 EFUSE_46h: RT_CHANNEL_DOMAIN_2G_FCC1_5G_FCC8
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_FCC8},
+
+ // #52 EFUSE_47h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI6
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI6},
+
+ // #53 EFUSE_48h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI7
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI7},
+
+ // #54 EFUSE_49h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI8
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI8},
+
+ // #55 EFUSE_50h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI9
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI9},
+
+ // #56 EFUSE_51h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI10
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI10},
+
+ // #57 EFUSE_52h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI11
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI11},
+
+ // #58 EFUSE_53h: RT_CHANNEL_DOMAIN_WW13_2G_5G_NCC4
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_NCC4},
+
+ // #59 EFUSE_54h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI12
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI12},
+
+ // #60 EFUSE_55h: RT_CHANNEL_DOMAIN_2G_FCC1_5G_FCC9
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_FCC9},
+
+ // #61 EFUSE_56h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI13
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI13},
+
+ // #62 EFUSE_57h: RT_CHANNEL_DOMAIN_2G_FCC1_5G_FCC10
+ {UNDEFINED, DOMAIN_CODE_2G_FCC1, DOMAIN_CODE_5G_FCC10},
+
+ // #63 EFUSE_58h: RT_CHANNEL_DOMAIN_2G_MKK2_5G_MKK4
+ {UNDEFINED, DOMAIN_CODE_2G_MKK2, DOMAIN_CODE_5G_MKK4},
+
+ // #64 EFUSE_59h: RT_CHANNEL_DOMAIN_WW13_2G_5G_ETSI14
+ {UNDEFINED, DOMAIN_CODE_2G_WORLD, DOMAIN_CODE_5G_ETSI14},
+
+ //1 ============= End of customer definition =============
+
+ //4 RT_CHANNEL_DOMAIN_WHQL_WFD
+ {UNDEFINED, DOMAIN_CODE_2G_WHQL_WFD, DOMAIN_CODE_5G_WHQL_WFD},
+
+//1 ============= End of New definition =============
+};
+
+/*------------------------Private of Protected Funtion Declaration-------------------------------------*/
+// The following function are called only in Dot11d.c
+BOOLEAN
+RtConstructChannelList(
+ IN PADAPTER pAdapter
+ );
+PRT_CHNL_LIST_ENTRY
+RtGetChnlListEntry(
+ IN PADAPTER pAdapter,
+ IN u1Byte Channel
+ );
+
+BOOLEAN
+RtConstructScanList(
+ IN PADAPTER pAdapter
+ );
+
+VOID
+RtCalcScanStatistic(
+ IN PADAPTER pAdapter
+ );
+
+VOID
+RtCalcScanPeriod(
+ IN PADAPTER pAdapter
+ );
+
+#if DBG
+VOID
+DumpChannelList(
+ IN PADAPTER pAdapter
+ );
+
+VOID
+DumpScanChannelList(
+ IN PADAPTER pAdapter
+ );
+#else
+ #define DumpChannelList(_pAdapter)
+ #define DumpScanChannelList(_pAdapter)
+#endif
+/*------------------------ End of Private of Protected Funtion Declaration------------------------------*/
+
+//------------------------------------------------------------------------------
+// Debug routines.
+//------------------------------------------------------------------------------
+#if DBG
+VOID
+DumpChannelList(
+ IN PADAPTER pAdapter
+ )
+{
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ u1Byte i;
+
+ FunctionIn(COMP_SCAN);
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("Channel Plan: ChannelLen %d\n", pChannelList->ChannelLen));
+ for(i = 0; i < pChannelList->ChannelLen; i ++)
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("%d ", pChannelList->ChnlListEntry[i].ChannelNum));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("\n"));
+
+ for(i = 0; i < pChannelList->ChannelLen; i ++)
+ {
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("##Channel: %d\n", pChannelList->ChnlListEntry[i].ChannelNum));
+ RT_TRACE(COMP_SCAN, DBG_TRACE, ("##ScanType: %d\n", pChannelList->ChnlListEntry[i].ScanType));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("##ScanPeriod: %d\n", pChannelList->ChnlListEntry[i].ScanPeriod));
+ RT_TRACE(COMP_SCAN, DBG_TRACE, ("##MaxTxPwrDbm: %d\n", pChannelList->ChnlListEntry[i].MaxTxPwrDbm));
+ RT_TRACE(COMP_SCAN, DBG_TRACE, ("##ExInfo: %X\n", pChannelList->ChnlListEntry[i].ExInfo));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("\n"));
+ }
+ RT_TRACE(COMP_SCAN, DBG_TRACE, ("\n"));
+
+ FunctionOut(COMP_SCAN);
+
+}
+
+VOID
+DumpScanChannelList(
+ IN PADAPTER pAdapter
+ )
+{
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ u1Byte i;
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan List: (len = %d) ", pChannelList->ScanChannelListLength));
+ for(i = 0; i < pChannelList->ScanChannelListLength; i ++)
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("%d ", pChannelList->ScanChannelList[i]->ChannelNum));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("\n"));
+}
+
+#endif
+
+// <20140311, Kordan> Knuth Shuffle Algorithm
+// Please refer to http://rosettacode.org/wiki/Knuth_shuffle#C
+
+void _shuffle(PRT_CHNL_LIST_ENTRY *list, u1Byte len) {
+ u4Byte j;
+ PRT_CHNL_LIST_ENTRY tmp;
+
+ while(len) {
+ j = (u4Byte)(PlatformGetCurrentTime()%len);
+ if (j != len - 1) {
+ tmp = list[j];
+ list[j] = list[len - 1];
+ list[len - 1] = tmp;
+ }
+ len--;
+ }
+}
+
+VOID
+shuffleScanChannelList(
+ IN PADAPTER pAdapter
+ )
+{
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+
+ if(pChannelList == NULL)
+ return;
+ else if(pChannelList->ScanChannelListLength == 0)
+ return;
+
+ _shuffle(pChannelList->ScanChannelList, pChannelList->ScanChannelListLength-1);
+}
+
+
+//
+// Description:
+// Reset to the state as we are just entering a regulatory domain.
+//
+VOID
+Dot11d_Reset(
+ IN PADAPTER pAdapter
+ )
+{
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
+
+ if(!pDot11dInfo->bEnabled)
+ return;
+
+ pDot11dInfo->State = DOT11D_STATE_NONE;
+ pDot11dInfo->CountryIeLen = 0;
+ pDot11dInfo->ChnlListLen = 0;
+ RESET_CIE_WATCHDOG(pMgntInfo);
+
+ RtResetChannelList(GET_RT_CHANNEL_LIST(pMgntInfo));
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("Dot11d_Reset()\n"));
+ AddDrvLog(pAdapter, LID_DOT11D_RESET, NULL, 0);
+}
+
+//
+// Description:
+// Update country IE from Beacon or Probe Resopnse
+// and configure PHY for operation in the regulatory domain.
+//
+// TODO:
+// Configure Tx power.
+//
+// Assumption:
+// 1. IS_DOT11D_ENABLE() is TRUE.
+// 2. Input IE is an valid one.
+//
+VOID
+Dot11d_UpdateCountryIe(
+ IN PADAPTER pAdapter,
+ IN pu1Byte pTaddr,
+ IN POCTET_STRING posCoutryIe
+ )
+{
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
+ u1Byte i, j, NumTriples, MaxChnlNum, ChnlListLen;
+ PCHNL_TXPOWER_TRIPLE pTriple;
+
+ MaxChnlNum = 0;
+ ChnlListLen = 0;
+ NumTriples = (posCoutryIe->Length - 3) / 3; // skip 3-byte country string.
+ pTriple = (PCHNL_TXPOWER_TRIPLE)(posCoutryIe->Octet + 3);
+
+ if(posCoutryIe->Length > MAX_IE_LEN)
+ return;
+
+ for(i = 0; i < NumTriples; i++)
+ {
+ if(MaxChnlNum >= pTriple->FirstChnl)
+ { // It is not in a monotonically increasing order, so stop processing.
+ RT_TRACE(COMP_SCAN, DBG_WARNING, ("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........\n"));
+ return;
+ }
+
+ if((pTriple->NumChnls+ChnlListLen) > DOT11D_MAX_CHNL_NUM)
+ {// To prevent malicious attack. Added by Roger, 2010.02.24.
+ RT_TRACE(COMP_SCAN, DBG_WARNING, ("Dot11d_UpdateCountryIe(): Invalid channel list length, skip it........\n"));
+ return;
+ }
+
+ for(j = 0 ; j < pTriple->NumChnls; j++)
+ {
+ pDot11dInfo->ChnlList[ChnlListLen] = (pTriple->FirstChnl + j);
+ pDot11dInfo->MaxTxPwrDbmList[ChnlListLen] = pTriple->MaxTxPowerInDbm;
+ MaxChnlNum = pDot11dInfo->ChnlList[ChnlListLen];// Keep tracking maximal channel number.
+ ChnlListLen++;
+ }
+ pTriple = (PCHNL_TXPOWER_TRIPLE)((pu1Byte)pTriple + 3);
+ }
+ pDot11dInfo->ChnlListLen = ChnlListLen;
+ RT_PRINT_DATA(COMP_SCAN, DBG_LOUD, "Dot11d_UpdateCountryIe(): Channel List:",
+ pDot11dInfo->ChnlList, pDot11dInfo->ChnlListLen);
+
+ UPDATE_CIE_SRC(pMgntInfo, pTaddr);
+
+ pDot11dInfo->CountryIeLen = posCoutryIe->Length;
+ PlatformMoveMemory(
+ pDot11dInfo->CountryIeBuf,
+ posCoutryIe->Octet,
+ pDot11dInfo->CountryIeLen);
+ pDot11dInfo->State = DOT11D_STATE_LEARNED;
+
+ RT_PRINT_STR(COMP_SCAN, DBG_LOUD, "Dot11d_UpdateCountryIe(): Country Code", &pDot11dInfo->CountryIeBuf[0], 3);
+ RT_PRINT_DATA(COMP_SCAN, DBG_TRACE, "Dot11d_UpdateCountryIe(): Country IE:",
+ pDot11dInfo->CountryIeBuf, pDot11dInfo->CountryIeLen);
+ AddDrvLog(pAdapter, LID_DOT11D_GET_COUNTRY_IE, pDot11dInfo->CountryIeBuf, pDot11dInfo->CountryIeLen);
+}
+
+
+//
+// Assumption:
+// 1. IS_DOT11D_ENABLE() is TRUE.
+// 2. Channel numbers in s_MaxChnlList[] or pDot11dInfo->ChnlList
+// are monotonically increasing.
+//
+u1Byte
+Dot11d_GetChannelList(
+ IN PADAPTER Adapter,
+ OUT pu1Byte* ppChnlList
+ )
+{
+ PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
+ pu1Byte pChnlList;
+ u1Byte ChnlListLen, First5gChnlIdx;
+
+ if(IS_COUNTRY_IE_VALID(pMgntInfo))
+ {
+ ChnlListLen = pDot11dInfo->ChnlListLen;
+ pChnlList = pDot11dInfo->ChnlList;
+ }
+ else
+ {
+ ChnlListLen = sizeof(s_MaxChnlList);
+ pChnlList = s_MaxChnlList;
+ }
+
+ for(First5gChnlIdx = 0; First5gChnlIdx < ChnlListLen; First5gChnlIdx++)
+ {
+ if(pChnlList[First5gChnlIdx] > 14)
+ break; // 1st A band channel bound
+ }
+
+ if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
+ {
+ pChnlList += First5gChnlIdx;
+ ChnlListLen -= First5gChnlIdx;
+ }
+ else
+ ChnlListLen = First5gChnlIdx;
+
+ if(ChnlListLen == 0)
+ *ppChnlList = NULL;
+ else
+ *ppChnlList = pChnlList;
+
+ RT_PRINT_DATA(COMP_SCAN, DBG_LOUD, "Dot11d_GetChannelList: ", *ppChnlList, ChnlListLen);
+
+ return ChnlListLen;
+}
+
+
+s4Byte
+DOT11D_GetMaxTxPwrInDbm(
+ IN PADAPTER Adapter,
+ IN u1Byte Channel
+ )
+{
+ PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
+ s4Byte MaxTxPwrInDbm = UNSPECIFIED_PWR_DBM;
+ u4Byte ChnlIdx = 0;
+
+ for(ChnlIdx = 0; ChnlIdx < pDot11dInfo->ChnlListLen; ChnlIdx++)
+ {
+ if(Channel == pDot11dInfo->ChnlList[ChnlIdx])
+ {
+ MaxTxPwrInDbm = (s4Byte)pDot11dInfo->MaxTxPwrDbmList[ChnlIdx];
+ break;
+ }
+ }
+
+ return MaxTxPwrInDbm;
+}
+
+
+VOID
+DOT11D_ScanComplete(
+ IN PADAPTER Adapter
+ )
+{
+ PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
+
+ switch(pDot11dInfo->State)
+ {
+ case DOT11D_STATE_LEARNED:
+ pDot11dInfo->State = DOT11D_STATE_DONE;
+
+ // Reset the channel list because dot11d has changed.
+ RtResetChannelList(GET_RT_CHANNEL_LIST(pMgntInfo));
+ break;
+
+ case DOT11D_STATE_DONE:
+ if( GET_CIE_WATCHDOG(pMgntInfo) == 0 )
+ { // Reset country IE if previous one is gone.
+ Dot11d_Reset(Adapter);
+ }
+ break;
+
+ default: //MacOS warning:enum value "DOT11D_STATE_NONE" not handled in switch
+ break;
+ }
+
+}
+
+//
+// Description:
+// The interface for all channel list actions.
+// Update the current channel list according to the input status code.
+// Arguments:
+// Adapter -
+// NIC adapter context pointer.
+// ActionCode -
+// An u4Byte number enumered in RT_CHNL_LIST_ACTION.
+// pInputBuf -
+// The input buffer as a pointer.
+// pOutputBuf -
+// The output buffer as a pointer.
+// Return Value:
+// TRUE if this action is complete, or retrun FALSE.
+// By Bruce, 2008-09-09.
+//
+BOOLEAN
+RtActChannelList(
+ IN PADAPTER pAdapter,
+ IN u4Byte ActionCode,
+ IN PVOID pInputBuf,
+ OUT PVOID pOutputBuf
+ )
+{
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ BOOLEAN bResult = TRUE;
+
+ switch(ActionCode)
+ {
+ case RT_CHNL_LIST_ACTION_INIT:
+ RtResetChannelList(GET_RT_CHANNEL_LIST(pMgntInfo));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_RESET\n"));
+ break;
+
+ case RT_CHNL_LIST_ACTION_CONSTRUCT:
+ bResult = RtConstructChannelList(pAdapter);
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_CONSTRUCT\n"));
+ break;
+
+ case RT_CHNL_LIST_ACTION_GET_CHANNEL_LIST:
+ {
+ PlatformAcquireSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ if(!IS_CHANNEL_LIST_VALID(pMgntInfo))
+ {
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_GET_CHANNEL_LIST IS_CHANNEL_LIST_VALID FALSE\n"));
+
+ RtConstructChannelList(pAdapter);
+ // Because RtConstructChannelList() will reset the scan list, so we construct again
+ bResult = RtConstructScanList(pAdapter);
+ RT_ASSERT(bResult, ("RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST fail!!\n"));
+ }
+ else
+ {
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+ }
+
+ // Save the channel list address to the output context.
+ if(pOutputBuf)
+ *((PRT_CHANNEL_LIST*)pOutputBuf) = GET_RT_CHANNEL_LIST(pMgntInfo);
+ }
+ // RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_GET_CHANNEL_LIST\n"));
+ break;
+ case RT_CHNL_LIST_ACTION_UPDATE_CHANNEL:
+ case RT_CHNL_LIST_ACTION_ADD_CHANNEL:
+ {
+ PRT_CHNL_LIST_ENTRY pChannelUpdateInfo = (PRT_CHNL_LIST_ENTRY)pInputBuf;
+ PRT_CHNL_LIST_ENTRY pChnlListEntry;
+
+ if(!pChannelUpdateInfo)
+ {
+ bResult = FALSE;
+ break;
+ }
+
+ PlatformAcquireSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ if(!IS_CHANNEL_LIST_VALID(pMgntInfo))
+ {
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_UPDATE(ADD)_CHANNEL IS_CHANNEL_LIST_VALID FALSE\n"));
+
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ RtConstructChannelList(pAdapter);
+ }
+ else
+ {
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+ }
+
+ pChnlListEntry = RtGetChnlListEntry(pAdapter, pChannelUpdateInfo->ChannelNum);
+
+ if(!pChnlListEntry)
+ { // No this channel, add into the channel list
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ if(pChannelList->ChannelLen < MAX_CHANNEL_NUM)
+ {
+ PlatformMoveMemory(&(pChannelList->ChnlListEntry[pChannelList->ChannelLen]), pChannelUpdateInfo, sizeof(RT_CHNL_LIST_ENTRY));
+ pChannelList->ChannelLen ++;
+ }
+ else
+ {
+ bResult = FALSE;
+ break;
+ }
+ }
+ else
+ {
+ PlatformMoveMemory(pChnlListEntry, pChannelUpdateInfo, sizeof(RT_CHNL_LIST_ENTRY));
+ }
+ }
+ // RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_UPDATE(ADD)_CHANNEL\n"));
+ break;
+
+ case RT_CHNL_LIST_ACTION_DEL_CHANNEL:
+ {
+ u1Byte Channel = *((pu1Byte)pInputBuf);
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ u1Byte i;
+
+ bResult = FALSE;
+ for(i = 0; i < pChannelList->ChannelLen; i ++)
+ {
+ if(pChannelList->ChnlListEntry[i].ChannelNum == Channel)
+ {
+ for(i=i; i < pChannelList->ChannelLen; i ++)
+ {
+ PlatformMoveMemory(&(pChannelList->ChnlListEntry[i]), &(pChannelList->ChnlListEntry[i + 1]), sizeof(RT_CHNL_LIST_ENTRY));
+ }
+ bResult = TRUE;
+ break;
+ }
+ }
+ }
+ // RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_DELETE_CHANNEL\n"));
+ break;
+
+ case RT_CHNL_LIST_ACTION_GET_CHANNEL:
+ {
+ u1Byte Channel = *((pu1Byte)pInputBuf);
+ PRT_CHNL_LIST_ENTRY pChnlListEntry = NULL;
+
+ PlatformAcquireSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ if(!IS_CHANNEL_LIST_VALID(pMgntInfo))
+ {
+ RT_TRACE(COMP_SCAN, DBG_TRACE, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_GET_CHANNEL IS_CHANNEL_LIST_VALID FALSE\n"));
+
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+ RtConstructChannelList(pAdapter);
+ }
+ else
+ {
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+ }
+
+ if((pChnlListEntry = RtGetChnlListEntry(pAdapter, Channel)) != NULL)
+ {
+ if(pChnlListEntry->ChannelNum == Channel)
+ *((PRT_CHNL_LIST_ENTRY*)pOutputBuf) = pChnlListEntry;
+ else
+ {
+ *((PRT_CHNL_LIST_ENTRY*)pOutputBuf) = NULL;
+ bResult = FALSE;
+ }
+ }
+ else
+ {
+ *((PRT_CHNL_LIST_ENTRY*)pOutputBuf) = NULL;
+ bResult = FALSE;
+ }
+ }
+ // RT_TRACE(COMP_SCAN, DBG_TRACE, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_GET_CHANNEL\n"));
+ break;
+
+ case RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST:
+ {
+ if(!IS_CHANNEL_LIST_VALID(pMgntInfo))
+ RtConstructChannelList(pAdapter);
+
+ bResult = RtConstructScanList(pAdapter);
+ }
+ //RT_ASSERT(bResult, ("RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST fail!!\n"));
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST\n"));
+ break;
+
+ case RT_CHNL_LIST_ACTION_POP_SCAN_CHANNEL:
+ {
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ PRT_CHNL_LIST_ENTRY pChnlListEntry = NULL;
+
+ pChnlListEntry = RtPopScanChannel(pChannelList);
+ if(pChnlListEntry)
+ {
+ bResult = TRUE;
+ *((PRT_CHNL_LIST_ENTRY*)pOutputBuf) = pChnlListEntry;
+ }
+ else
+ {
+ bResult = FALSE;
+ *((PRT_CHNL_LIST_ENTRY*)pOutputBuf) = NULL;
+ }
+ }
+ // RT_TRACE(COMP_SCAN, DBG_TRACE, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_POP_SCAN_CHANNEL\n"));
+ break;
+
+ case RT_CHNL_LIST_ACTION_GET_SCAN_CHANNEL:
+ {
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ PRT_CHNL_LIST_ENTRY pChnlListEntry = NULL;
+
+ pChnlListEntry = RtGetScanChannel(pChannelList);
+ if(pChnlListEntry)
+ {
+ bResult = TRUE;
+ *((PRT_CHNL_LIST_ENTRY*)pOutputBuf) = pChnlListEntry;
+ }
+ else
+ {
+ bResult = FALSE;
+ *((PRT_CHNL_LIST_ENTRY*)pOutputBuf) = NULL;
+ }
+
+ if(pChannelList != NULL)
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("RtActChannelList(): <=====RT_CHNL_LIST_ACTION_GET_SCAN_CHANNEL index %d length %d channellength %d\n", pChannelList->ScanChannelIndex, pChannelList->ScanChannelListLength, pChannelList->ChannelLen));
+ }
+ break;
+
+ case RT_CHNL_LIST_ACTION_GET_CHANNEL_PLAN:
+ {
+ if(pInputBuf)
+ *(RT_CHANNEL_PLAN **)pOutputBuf = &DefaultChannelPlan[*(RT_CHANNEL_DOMAIN *)pInputBuf];
+ }
+ break;
+
+ default:
+ bResult = FALSE;
+ RT_TRACE(COMP_SCAN, DBG_WARNING, ("RtActChannelList(): NO RT_CHNL_LIST_ACTION!!!\n"));
+ break;
+ }
+
+ return bResult;
+}
+
+//
+// Description:
+// Find the channel information in the channel list and retrun the address.
+// By Bruce, 2008-09-09.
+//
+PRT_CHNL_LIST_ENTRY
+RtGetChnlListEntry(
+ IN PADAPTER pAdapter,
+ IN u1Byte Channel
+ )
+{
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ PRT_CHNL_LIST_ENTRY pChnlListEntry;
+ int i = 0;
+
+ if(pChannelList->ChannelLen == 0)
+ return NULL;
+
+ for(i = 0; i < pChannelList->ChannelLen; i ++)
+ {
+ if(pChannelList->ChnlListEntry[i].ChannelNum == Channel)
+ {
+ pChnlListEntry = &(pChannelList->ChnlListEntry[i]);
+ return pChnlListEntry;
+ }
+ }
+
+ return NULL;
+}
+
+u1Byte
+RtCustomizeChannelList(
+ PMGNT_INFO pMgntInfo,
+ u1Byte ChannelPlan,
+ u1Byte ChannelLen,
+ PRT_CHNL_LIST_ENTRY pChnlList
+ )
+{
+ u1Byte i;
+ PRT_CHNL_LIST_ENTRY pChnlListEntry;
+
+ //3 // Put Customized Action here...
+ switch(ChannelPlan)
+ {
+ case RT_CHANNEL_DOMAIN_GLOBAL_DOMAIN:
+ case RT_CHANNEL_DOMAIN_GLOBAL_DOMAIN_2G: // 2G global domain.
+ {
+ for(i = 0; i < ChannelLen; i ++)
+ {
+ pChnlListEntry = &(pChnlList[i]);
+
+ // (1) Start IBSS at channel 1~11.
+ // (2) Join IBSS at channel 1~11.
+ if(pChnlListEntry->ChannelNum >= 12 && pChnlListEntry->ChannelNum <= 14)
+ {
+ pChnlListEntry->ExInfo |= CHANNEL_EXINFO_NO_IBSS_JOIN;
+ pChnlListEntry->ExInfo |= CHANNEL_EXINFO_NO_IBSS_START;
+ }
+ else
+ {
+ pChnlListEntry->ExInfo &= ~CHANNEL_EXINFO_NO_IBSS_JOIN;
+ pChnlListEntry->ExInfo &= ~CHANNEL_EXINFO_NO_IBSS_START;
+ }
+
+ // (3) Channel 1~11 is active, and 12~14 is passive when dot11 is not learned yet.
+ if(!IS_COUNTRY_IE_VALID(pMgntInfo))
+ {
+ if(pChnlListEntry->ChannelNum >= 1 && pChnlListEntry->ChannelNum <= 11)
+ {
+ pChnlListEntry->ScanType = SCAN_ACTIVE;
+ pChnlListEntry->ScanPeriod = DEFAULT_ACTIVE_SCAN_PERIOD;
+ }
+
+ if((pChnlListEntry->ChannelNum >= 12 && pChnlListEntry->ChannelNum <= 14))
+ {
+ pChnlListEntry->ScanType = SCAN_PASSIVE;
+ pChnlListEntry->ScanPeriod = DEFAULT_PASSIVE_SCAN_PERIOD;
+ }
+ }
+ }
+ }
+ break;
+
+ case RT_CHANNEL_DOMAIN_WORLD_WIDE_13:
+ {
+ for(i = 0; i < ChannelLen; i ++)
+ {
+ pChnlListEntry = &(pChnlList[i]);
+
+ // (1) Channel 14 is disable
+ if(pChnlListEntry->ChannelNum == 14)
+ {
+ for(++ i; i < ChannelLen; i ++)
+ {
+ PlatformMoveMemory(&(pChnlList[i - 1]), &(pChnlList[i]), sizeof(RT_CHNL_LIST_ENTRY));
+ }
+ ChannelLen --;
+ break;
+ }
+
+ // (2) Join IBSS at channel 1~11.
+ // (3) Start IBSS at channel 1~11.
+ // (4) channel 12~13, passive scan
+ if(pChnlListEntry->ChannelNum >= 12 && pChnlListEntry->ChannelNum <= 13)
+ {
+ pChnlListEntry->ExInfo |= (CHANNEL_EXINFO_NO_IBSS_JOIN);
+ pChnlListEntry->ExInfo |= (CHANNEL_EXINFO_NO_IBSS_START);
+ pChnlListEntry->ScanType = SCAN_MIX;
+ pChnlListEntry->ScanPeriod = DEFAULT_PASSIVE_SCAN_PERIOD;
+ }
+ }
+ }
+ break;
+ case RT_CHANNEL_DOMAIN_DEFAULT://For Realtek default setting
+ {
+ for(i = 0; i < ChannelLen; i ++)
+ {
+ pChnlListEntry = &(pChnlList[i]);
+
+ // (2) Join IBSS at channel 1~11.
+ // (3) Start IBSS at channel 1~11.
+ // (4) channel 12~13, passive scan
+ if(pChnlListEntry->ChannelNum <=13 && pChnlListEntry->ChannelNum >= 12)
+ {
+ pChnlListEntry->ExInfo |= (CHANNEL_EXINFO_NO_IBSS_JOIN);
+ pChnlListEntry->ExInfo |= (CHANNEL_EXINFO_NO_IBSS_START);
+ pChnlListEntry->ScanType = SCAN_MIX;
+ pChnlListEntry->ScanPeriod = DEFAULT_PASSIVE_SCAN_PERIOD;
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ switch(pMgntInfo->CustomerID)
+ {
+
+
+ case RT_CID_WHQL:
+ {
+ for(i = 0; i < ChannelLen; i ++)
+ {
+ pChnlListEntry = &(pChnlList[i]);
+ pChnlListEntry->ScanPeriod = SCAN_PERIOD_Long_Win_DTM;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return ChannelLen;
+}
+
+VOID
+_ForcedChannelPlan(
+ PMGNT_INFO pMgntInfo,
+ BOOLEAN bIs5G,
+ pu1Byte pChnlList,
+ pu1Byte pChannelLen
+ )
+{
+ ps1Byte s = (ps1Byte)((bIs5G) ? pMgntInfo->RegChannelPlan5G.Octet :
+ pMgntInfo->RegChannelPlan2G.Octet);
+ u2Byte len = ((bIs5G) ? pMgntInfo->RegChannelPlan5G.Length :
+ pMgntInfo->RegChannelPlan2G.Length);
+ u1Byte c = 0, n = 0, i = 0;
+
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("===> _ForcedChannelPlan\n"));
+
+ if (bIs5G)
+ if (pMgntInfo->RegChannelPlan5G.bDefaultStr)
+ return;
+ else
+ if (pMgntInfo->RegChannelPlan2G.bDefaultStr)
+ return;
+
+ PlatformZeroMemory(pChnlList, *pChannelLen);
+ *pChannelLen = 0;
+
+ for (i = 0; i < len; ++i, ++s) {
+ while (*s != ',' && *s >= '0' && *s <= '9') {
+ c = 10 * c + (*s - '0');
+ s++, i++;
+ }
+ pChnlList[n++] = c;
+ c = 0;
+ }
+
+ *pChannelLen = n;
+
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("<=== _ForcedChannelPlan\n"));
+}
+
+//
+// Description:
+// (Re-)Construct the channel list by 11d or default channel plan.
+// Note:
+// We collect all customized requests of joining/scanning about each channel in here.
+// By Bruce, 2008-09-09.
+//
+BOOLEAN
+RtConstructChannelList(
+ IN PADAPTER pAdapter
+ )
+{
+ pu1Byte pChnlList = NULL;
+ u1Byte ChnlsLen = 0, i = 0;
+ PRT_CHNL_LIST_ENTRY pChnlListEntry;
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ RT_CHANNEL_DOMAIN ChannelPlan = GetDefaultMgntInfo(pAdapter)->ChannelPlan;
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+
+ PlatformAcquireSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ if(pAdapter->pNdis62Common != NULL)
+ RT_TRACE_F(COMP_SCAN, DBG_LOUD, ("port number %d \n", pAdapter->pNdis62Common->PortNumber));
+
+ if(ChannelPlan >= RT_CHANNEL_DOMAIN_MAX) // Channel Plan is invalid, fix it.
+ pMgntInfo->ChannelPlan = RT_CHANNEL_DOMAIN_FCC;
+
+ RtResetChannelList(pChannelList);
+
+ pChannelList->ChannelPlan = ChannelPlan;
+
+ //3 // Dot11d or Default Channel Plan
+ if(IS_DOT11D_ENABLE(pMgntInfo))
+ { // dot11d is enabled.
+ RT_SCAN_TYPE scanType = SCAN_ACTIVE;
+
+ if(!IS_COUNTRY_IE_VALID(pMgntInfo))
+ { // domain learning is not complete
+ scanType = SCAN_PASSIVE;
+ }
+
+ ChnlsLen = Dot11d_GetChannelList(pAdapter, &pChnlList);
+
+ if(ChnlsLen > MAX_CHANNEL_NUM)
+ {
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+ return FALSE;
+ }
+
+ for(i = 0; i < ChnlsLen; i ++)
+ {
+ // Check if the channel is valid for the current wireless mode.
+ if(!CHNL_ValidForWirelessMode(pChnlList[i], (u2Byte)pMgntInfo->dot11CurrentWirelessMode))
+ continue;
+
+ pChnlListEntry = &(pChannelList->ChnlListEntry[i]);
+
+ pChnlListEntry->ChannelNum = pChnlList[i];
+
+ // For 5G FCC Radar channel, default passive scan
+ if(DFS_5G_RADAR_CHANNEL(pChnlListEntry->ChannelNum))
+ {
+ RT_TRACE( COMP_DFS, DBG_LOUD, ("DFS_5G_RADAR_CHANNEL, 802.11d, set chnl %d to passive scan.\n", pChnlListEntry->ChannelNum));
+ pChnlListEntry->ScanType = SCAN_PASSIVE;
+ DFS_StaInsertToRadarChnlList(pAdapter, pChnlListEntry->ChannelNum);
+ }
+ else
+ pChnlListEntry->ScanType = scanType;
+
+ pChnlListEntry->ScanPeriod = (scanType == SCAN_ACTIVE) ? DEFAULT_ACTIVE_SCAN_PERIOD : DEFAULT_PASSIVE_SCAN_PERIOD;
+ pChnlListEntry->MaxTxPwrDbm = DOT11D_GetMaxTxPwrInDbm(pAdapter, pChnlListEntry->ChannelNum);
+ pChnlListEntry->ExInfo = 0;
+
+ if(!IS_COUNTRY_IE_VALID(pMgntInfo))
+ { // domain learning is not complete, we cannot start IBSS.
+ pChnlListEntry->ExInfo |= CHANNEL_EXINFO_NO_IBSS_START;
+ }
+
+ pChannelList->ChannelLen ++;
+ }
+
+ pChannelList->bDot11d = TRUE;
+ }
+ else
+ { // Normal Case
+ u1Byte usbswchnl;
+ RT_TRACE( COMP_SCAN, DBG_LOUD, ("_RT_CHANNEL_DOMAIN(0x%X) mapped from hal_MapChannelPlan: %s channel plan is applied.\n",
+ ChannelPlan, (ChannelPlan >= RT_CHANNEL_DOMAIN_WHQL)?"New":"Legacy"));
+
+ if (ChannelPlan < RT_CHANNEL_DOMAIN_WW13_2G)
+ {
+ pChnlList = DefaultChannelPlan[pChannelList->ChannelPlan].Channel;
+ ChnlsLen = DefaultChannelPlan[pChannelList->ChannelPlan].Len;
+ }
+ else
+ {
+ if(IS_WIRELESS_MODE_5G(pAdapter))
+ {
+ pChnlList = DefaultChannelPlan[pChannelList->ChannelPlan].Channel5G;
+ ChnlsLen = DefaultChannelPlan[pChannelList->ChannelPlan].Len5G;
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("===>RtConstructChannelList, DefaultChannelPlan[%d].Channel5G: ", pChannelList->ChannelPlan));
+ }
+ else
+ {
+ pChnlList = DefaultChannelPlan[pChannelList->ChannelPlan].Channel2_4G;
+ ChnlsLen = DefaultChannelPlan[pChannelList->ChannelPlan].Len2_4G;
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("===>RtConstructChannelList, DefaultChannelPlan[%d].Channel2.4G: ", pChannelList->ChannelPlan));
+ }
+
+ }
+
+ if (pMgntInfo->RegChannelPlan2G.bDefaultStr != TRUE ||
+ pMgntInfo->RegChannelPlan5G.bDefaultStr != TRUE)
+ _ForcedChannelPlan(pMgntInfo, IS_WIRELESS_MODE_5G(pAdapter), pChnlList, &ChnlsLen);
+
+ for(i = 0; i < ChnlsLen; i ++)
+ {
+
+ // Check if the channel is valid for the current wireless mode.
+ if (!CHNL_ValidForWirelessMode(pChnlList[i], pMgntInfo->dot11CurrentWirelessMode))
+ {
+ // RT_TRACE_F(COMP_SCAN, DBG_LOUD, ("Skip channel (%d) for wirelessMode (%d)\n", pChnlList[i], pMgntInfo->dot11CurrentWirelessMode));
+ continue;
+ }
+
+ pChnlListEntry = &(pChannelList->ChnlListEntry[pChannelList->ChannelLen]);
+
+ pChnlListEntry->ChannelNum = pChnlList[i];
+
+ // For 5G FCC Radar channel, default passive scan
+ if (DFS_5G_RADAR_CHANNEL(pChnlListEntry->ChannelNum))
+ {
+ RT_TRACE( COMP_DFS, DBG_LOUD, ("DFS_5G_RADAR_CHANNEL, Non 802.11d, set chnl %d to passive scan.\n", pChnlListEntry->ChannelNum));
+ pChnlListEntry->ScanType = SCAN_PASSIVE;
+ DFS_StaInsertToRadarChnlList(pAdapter, pChnlListEntry->ChannelNum);
+ }
+ else
+ {
+ if (pMgntInfo->RegPassiveScan && ChannelPlan == RT_CHANNEL_DOMAIN_DEFAULT)
+ {
+ // 0= by channel plan, 1=5g all passive scan / 2= 24g passive scan /3= 2/5g all passive scan
+ if (pMgntInfo->RegPassiveScan == 1 && pChnlListEntry->ChannelNum >= 36)
+ {
+ RT_TRACE( COMP_DFS, DBG_LOUD, ("CHNL-%d passive scan", pChnlListEntry->ChannelNum));
+ pChnlListEntry->ScanType = SCAN_PASSIVE;
+ }
+ else if (pMgntInfo->RegPassiveScan == 2 && pChnlListEntry->ChannelNum <= 14)
+ {
+ pChnlListEntry->ScanType = SCAN_PASSIVE;
+ }
+ else if (pMgntInfo->RegPassiveScan == 3)
+ {
+ pChnlListEntry->ScanType = SCAN_PASSIVE;
+ }
+ else
+ {
+ pChnlListEntry->ScanType = SCAN_ACTIVE;
+ }
+ }
+ else
+ pChnlListEntry->ScanType = SCAN_ACTIVE;
+
+ }
+
+ if(pAdapter->bInHctTest)
+ pChnlListEntry->ScanPeriod = SCAN_PERIOD_Long_Win_DTM;
+ else
+ {
+ {
+ pChnlListEntry->ScanPeriod = DEFAULT_ACTIVE_SCAN_PERIOD;
+ }
+ }
+ pChnlListEntry->MaxTxPwrDbm = UNSPECIFIED_PWR_DBM;
+ pChnlListEntry->ExInfo = 0;
+
+ pChannelList->ChannelLen ++;
+ }
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("===>RtConstructChannelList, ChannelList: "));
+ for (i = 0; i < pChannelList->ChannelLen; ++i)
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("%d ", (pChannelList->ChnlListEntry[i]).ChannelNum));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("\n "));
+ }
+
+ pChannelList->WirelessMode = pMgntInfo->dot11CurrentWirelessMode;
+
+ pChannelList->ChannelLen = RtCustomizeChannelList(pMgntInfo, pChannelList->ChannelPlan, pChannelList->ChannelLen, pChannelList->ChnlListEntry);
+
+ // Increase the weighted channel
+ #ifdef USE_SMART_SCAN
+ {
+ u1Byte WeightedChannel[3] = {1, 6, 11};
+
+ for(i = 0; i < 3; i ++)
+ {
+ if((pChnlListEntry = RtGetChnlListEntry(pAdapter, WeightedChannel[i])) != NULL)
+ pChnlListEntry->ExInfo |= CHANNEL_EXINFO_WEIGHTED_SCAN_PERIOD;
+ }
+ }
+ #endif // #ifdef USE_SMART_SCAN
+
+ if(!pAdapter->bInHctTest)
+ {
+ for(i = 0; i < pChannelList->ChannelLen; i ++)
+ {
+ pChnlListEntry = &(pChannelList->ChnlListEntry[i]);
+ pChnlListEntry->ScanPeriod = SCAN_PERIOD_Long;
+ }
+ }
+
+ DumpChannelList(pAdapter);
+
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ FunctionOut(COMP_SCAN);
+
+ return TRUE;
+}
+
+u1Byte
+RtGetConnectedChannels(
+ IN PADAPTER pAdapter,
+ OUT pu1Byte ConnectedChannels,
+ IN u1Byte maxChnlArrayNum
+)
+{
+ PADAPTER pDefaultAdapter = GetDefaultAdapter(pAdapter);
+ u1Byte uNumberOfConnectedChannel = 0;
+ u1Byte i = 0;
+ BOOLEAN bDuplicate = FALSE;
+
+ if(0 == (uNumberOfConnectedChannel = MultiChannelGetConnectedChannels(
+ pAdapter,
+ ConnectedChannels,
+ maxChnlArrayNum)))
+ {
+ ConnectedChannels[uNumberOfConnectedChannel++] = pDefaultAdapter->MgntInfo.dot11CurrentChannelNumber;
+ }
+
+ // Let AP can serve the Client During scanning -------------------------------------------------------------------
+ if(IsAPModeExist(pDefaultAdapter))
+ {
+ bDuplicate = FALSE;
+
+ for(i = 0; i < uNumberOfConnectedChannel; i++)
+ {
+ if(ConnectedChannels[i] == pDefaultAdapter->MgntInfo.dot11CurrentChannelNumber)
+ {
+ bDuplicate = TRUE;
+ break;
+ }
+ }
+
+ if(bDuplicate == FALSE)
+ {
+ ConnectedChannels[uNumberOfConnectedChannel++] = pDefaultAdapter->MgntInfo.dot11CurrentChannelNumber;
+ }
+ }
+ // --------------------------------------------------------------------------------------------------------
+
+
+ return uNumberOfConnectedChannel;
+}
+
+
+
+//
+// Description:
+// (Re-)Construct the scan channel list.
+// Any customized request about scanning can be put here.
+// By Bruce, 2008-09-09.
+//
+BOOLEAN
+RtConstructScanList(
+ IN PADAPTER pAdapter
+ )
+{
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PADAPTER pDefaultAdapter = GetDefaultAdapter(pAdapter);
+
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ PRT_CHNL_LIST_ENTRY pChnlListEntry = NULL, pFinalChnlListEntry = NULL;
+ u2Byte i, j, k;
+
+ u1Byte ConnectedChannels[MAX_SCAN_CHANNEL_NUM];
+ u1Byte uNumberOfConnectedChannel = 0;
+
+ const u1Byte CountForAddConnectedChannel = 2;
+ u1Byte uAccumulatedCountForAdd = 0;
+
+ u1Byte BackupScanChannelListLength;
+ PRT_CHNL_LIST_ENTRY BackupScanChannelList[MAX_SCAN_CHANNEL_NUM];
+ BOOLEAN bRet = FALSE;
+
+ if(pAdapter->pNdis62Common != NULL)
+ RT_TRACE_F(COMP_SCAN, DBG_LOUD, ("port number %d \n", pAdapter->pNdis62Common->PortNumber));
+
+ PlatformAcquireSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ RtResetScanChannel(pChannelList);
+
+ RtCalcScanStatistic(pAdapter);
+ RtCalcScanPeriod(pAdapter);
+
+ RT_TRACE_F(COMP_SCAN, DBG_LOUD, ("ChannelLen %d \n", pChannelList->ChannelLen));
+
+ if(pDefaultAdapter->bInWFDTest && pDefaultAdapter->MgntInfo.WFDOpChannel != 0)
+ {
+ // Rearrange scan channel(one based)
+ for(i = 0; i < pChannelList->ChannelLen; i ++)
+ {
+ pChnlListEntry = &(pChannelList->ChnlListEntry[i]);
+
+ if(pChnlListEntry->ChannelNum == pDefaultAdapter->MgntInfo.WFDOpChannel)
+ {
+ RtInsertScanChannel(pChannelList, pChnlListEntry);
+ }
+ }
+ }
+
+ // Rearrange scan channel(one based)
+ for(i = 0; i < CHANNEL_SCAN_CYCLE_NUM; i ++)
+ {
+ for(j = i; j < pChannelList->ChannelLen; j += CHANNEL_SCAN_CYCLE_NUM)
+ {
+ pChnlListEntry = &(pChannelList->ChnlListEntry[j]);
+
+ if(pChnlListEntry->ChannelNum == pMgntInfo->dot11CurrentChannelNumber)
+ {
+ //4 //Put ChannelNumBeforeScan at the end of the channel list
+ //4 //So we don't need to do channel switch after scan.
+ pFinalChnlListEntry = pChnlListEntry;
+ }
+ else
+ {
+ if(!pDefaultAdapter->bInWFDTest ||
+ (pChnlListEntry->ChannelNum != pDefaultAdapter->MgntInfo.WFDOpChannel))
+ RtInsertScanChannel(pChannelList, pChnlListEntry);
+ }
+ }
+ }
+
+ if(pFinalChnlListEntry)
+ {
+ RtInsertScanChannel(pChannelList, pFinalChnlListEntry);
+ }
+
+ //8192DE SMSP Dual Scan for Hidden SSID
+ if(pMgntInfo->bNeedSkipScan )//Add hidded ssid's channel to first place.
+ {
+ PRT_CHNL_LIST_ENTRY ptmpChnlListEntry = NULL;
+ ptmpChnlListEntry = (pChannelList->ScanChannelList[0]);
+ for(j = 1; j < pChannelList->ChannelLen; j ++)
+ {
+ pChnlListEntry = (pChannelList->ScanChannelList[j]);
+
+ if(pChnlListEntry->ChannelNum == pMgntInfo->hiddenChannel)
+ {
+ pChannelList->ScanChannelList[0] = pChnlListEntry;
+ pChannelList->ScanChannelList[j] = ptmpChnlListEntry;
+ break;
+ }
+ }
+ }
+
+
+ // Construct Connected Channels: ---------------------------------------------------------------
+ uNumberOfConnectedChannel = RtGetConnectedChannels(pAdapter, ConnectedChannels, MAX_SCAN_CHANNEL_NUM);
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("%s: uNumberOfConnectedChannel: %d\n",
+ __FUNCTION__, uNumberOfConnectedChannel)
+ );
+
+ for(i = 0; i < uNumberOfConnectedChannel; i++)
+ {
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("%s: Connected Channel: %d\n",
+ __FUNCTION__, ConnectedChannels[i])
+ );
+ }
+ // ------------------------------------------------------------------------------------------
+
+ if(pMgntInfo->dot11CurrentChannelBandWidth == CHANNEL_WIDTH_20) //yangjun121019
+ {
+ // Insert Connected Channel for Every CountForAddConnectedChannel (Default 2) Channels -----------------------------------
+ for(k = 0; k < uNumberOfConnectedChannel; k++)
+ {
+ // Search for the Connected Channel Information
+ for(i = 0; i < pChannelList->ChannelLen; i++)
+ {
+ pChnlListEntry = &(pChannelList->ChnlListEntry[i]);
+
+ if(pChnlListEntry->ChannelNum == ConnectedChannels[k])
+ {
+ // Backup the ScanChannelList
+ BackupScanChannelListLength = pChannelList->ScanChannelListLength;
+ PlatformMoveMemory(BackupScanChannelList, pChannelList->ScanChannelList, sizeof(BackupScanChannelList));
+
+ // Clean the ScanChannel
+ RtResetScanChannel(pChannelList);
+
+ // Set the Flag for Connected Channel
+ pChnlListEntry->ExInfo |= CHANNEL_EXINFO_CONNECTED_CHANNEL;
+
+ for(j = 0, uAccumulatedCountForAdd = 0; j < BackupScanChannelListLength; j++)
+ {
+ RtInsertScanChannel(pChannelList, BackupScanChannelList[j]);
+
+ if(BackupScanChannelList[j]->ChannelNum != ConnectedChannels[k])
+ {// Different Channel
+ uAccumulatedCountForAdd++;
+
+ if(uAccumulatedCountForAdd % CountForAddConnectedChannel == 0)
+ {// Insert Connected Channel
+ RtInsertScanChannel(pChannelList, pChnlListEntry);
+ }
+ }
+ else
+ {// Same Channel as Connected Channel
+ uAccumulatedCountForAdd = 0;
+ }
+ }
+
+ break;
+ }
+ }
+ }
+ // ------------------------------------------------------------------------------------------------------------
+ }
+
+ if(CustomScan_ConstructScanListCb(GET_CUSTOM_SCAN_INFO(pAdapter), pChannelList))
+ {// system scan
+ if(!pDefaultAdapter->bInHctTest)
+ shuffleScanChannelList(pAdapter);
+ DumpScanChannelList(pAdapter);
+ bRet = (0 != pChannelList->ScanChannelListLength);
+ }
+ else
+ {// other
+ DumpScanChannelList(pAdapter);
+ bRet = (0 != pChannelList->ScanChannelListLength);
+ }
+
+ PlatformReleaseSpinLock(pAdapter, RT_CHNLLIST_SPINLOCK);
+
+ FunctionOut(COMP_SCAN);
+
+ return bRet;
+}
+
+//
+// Caculate the statistic of the scan list.
+//
+VOID
+RtCalcScanStatistic(
+ IN PADAPTER pAdapter
+ )
+{
+ u1Byte j;
+ u2Byte ChannelNum, i;
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+
+ PlatformZeroMemory(pChannelList->EachChannelSTAs, MAX_SCAN_CHANNEL_NUM);
+ pChannelList->bValidSTAStatis = FALSE;
+
+ if(pMgntInfo->NumBssDesc4Query == 0)
+ return;
+
+ pChannelList->bValidSTAStatis = TRUE;
+ for(i = 0; i < pMgntInfo->NumBssDesc4Query; i++)
+ {
+ ChannelNum = pMgntInfo->bssDesc4Query[i].ChannelNumber;
+ for(j = 0; j < pChannelList->ChannelLen; j++)
+ {
+ if(pChannelList->ChnlListEntry[j].ChannelNum == ChannelNum)
+ {
+ pChannelList->EachChannelSTAs[j]++;
+ break;
+ }
+ }
+ }
+}
+
+//
+// Description:
+// Caculate the scan period.
+// By Bruce, 2009-04-09.
+//
+VOID
+RtCalcScanPeriod(
+ IN PADAPTER pAdapter
+ )
+{
+ u1Byte i;
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ static u1Byte Scan5gCnt = 0;
+ BOOLEAN bShortScanPeriod = FALSE;
+
+ if(IsActiveAPModeExist(pAdapter)
+ /*||pMgntInfo->mAssoc || pMgntInfo->bMediaConnect*/)// comment out for temporary solve less AP scaned when connected, Sean, 201501
+ {
+ bShortScanPeriod = TRUE;
+ }
+
+ if(IS_5G_WIRELESS_MODE(pChannelList->WirelessMode))
+ Scan5gCnt++;
+
+ for(i = 0; i < pChannelList->ChannelLen; i++)
+ {
+ if(pAdapter->bInHctTest)
+ {
+ //For Win7 DTMTest (Performance_ext). To avoid scan too long to roaming to another AP more than 4.1 seconds.
+ //Maddest 05132009.
+ if(pMgntInfo->NdisVersion>=RT_NDIS_VERSION_6_20)
+ pChannelList->ChnlListEntry[i].ScanPeriod =SCAN_PERIOD_Long_Win_DTM;
+ else
+ pChannelList->ChnlListEntry[i].ScanPeriod = DEFAULT_ACTIVE_SCAN_PERIOD;
+
+ }
+ else if(bShortScanPeriod)
+ {
+ pChannelList->ChnlListEntry[i].ScanPeriod = SCAN_PERIOD_Short;
+ }
+ else if(pMgntInfo->RegForcedScanPeriod != 0 )
+ {
+ pChannelList->ChnlListEntry[i].ScanPeriod = pMgntInfo->RegForcedScanPeriod;
+ }
+ else if(pChannelList->ChnlListEntry[i].ScanType == SCAN_PASSIVE)
+ {
+ if(pChannelList->ChannelPlan == RT_CHANNEL_DOMAIN_WORLD_WIDE_5G || pChannelList->ChannelLen >= 15)
+ {
+ pChannelList->ChnlListEntry[i].ScanPeriod = ((i+Scan5gCnt)%3)?50:100;
+ }
+ else
+ {
+ pChannelList->ChnlListEntry[i].ScanPeriod = DEFAULT_PASSIVE_SCAN_PERIOD;
+ }
+ }
+ else if(pMgntInfo->bScanOnly && pChannelList->bValidSTAStatis)
+ {
+ //
+ // If "pMgntInfo->bScanOnly" is set false as scanning for join, we shall not set the scan period too long.
+ // A long scan period may cause join procedure timeout.
+ // Such as the example under XP, the ndis sets the SSID and wait just 2 Seconds for join complete.
+ // If we cannot complete the join procedure as soon as possible (in 2 s), it will set the dummy SSID, which
+ // a reset command, and stop the driver stop the join procedure.
+ // By Bruce, 2009-04-09.
+ //
+ if(pChannelList->EachChannelSTAs[i] >= Scan_STA_Large)
+ {
+ RT_TRACE( COMP_SCAN, DBG_TRACE, ("RtCalcScanPeriod, Scan_STA_Large change ScanPeriod from %d to %d/%d\n", pChannelList->ChnlListEntry[i].ScanPeriod, pMgntInfo->RegScanLarge, SCAN_PERIOD_Long));
+
+ if( pMgntInfo->RegScanLarge == 0 )
+ pChannelList->ChnlListEntry[i].ScanPeriod = SMART_SCAN_PERIOD_LONG;
+ else
+ pChannelList->ChnlListEntry[i].ScanPeriod = pMgntInfo->RegScanLarge;
+ }
+ else if(pChannelList->EachChannelSTAs[i] >= Scan_STA_Middle)
+ {
+ RT_TRACE( COMP_SCAN, DBG_TRACE, ("RtCalcScanPeriod, Scan_STA_Middle change ScanPeriod from %d to %d/%d\n", pChannelList->ChnlListEntry[i].ScanPeriod, pMgntInfo->RegScanMiddle, DEFAULT_ACTIVE_SCAN_PERIOD));
+
+ if( pMgntInfo->RegScanMiddle== 0 )
+ pChannelList->ChnlListEntry[i].ScanPeriod = SMART_SCAN_PERIOD_MIDDLE;
+ else
+ pChannelList->ChnlListEntry[i].ScanPeriod = pMgntInfo->RegScanMiddle;
+ }
+ else
+ {
+ RT_TRACE( COMP_SCAN, DBG_TRACE, ("RtCalcScanPeriod, !(Scan_STA_Large && Scan_STA_Middle) change ScanPeriod from %d to %d/%d\n", pChannelList->ChnlListEntry[i].ScanPeriod, pMgntInfo->RegScanNormal, SCAN_PERIOD_Short));
+
+ if( pMgntInfo->RegScanNormal== 0 )
+ pChannelList->ChnlListEntry[i].ScanPeriod = SMART_SCAN_PERIOD_SHORT;
+ else
+ pChannelList->ChnlListEntry[i].ScanPeriod = pMgntInfo->RegScanNormal;
+ }
+ }
+ else
+ {
+ RT_TRACE( COMP_SCAN, DBG_TRACE, ("RtCalcScanPeriod, change ScanPeriod from %d to %d/%d\n", pChannelList->ChnlListEntry[i].ScanPeriod, pMgntInfo->RegScanActive, DEFAULT_ACTIVE_SCAN_PERIOD));
+
+ //20121121 Sinda enlarge scan time per channel from 50 ms to 100 ms.
+ if( pMgntInfo->RegScanActive== 0 )
+ pChannelList->ChnlListEntry[i].ScanPeriod = DEFAULT_PASSIVE_SCAN_PERIOD;
+ else
+ pChannelList->ChnlListEntry[i].ScanPeriod = pMgntInfo->RegScanActive;
+ }
+
+ RT_TRACE(COMP_SCAN, DBG_TRACE, ("channel %d STAs %d Period %d\n", pChannelList->ChnlListEntry[i].ChannelNum, pChannelList->EachChannelSTAs[i], pChannelList->ChnlListEntry[i].ScanPeriod));
+ }
+
+}
+
+
+//sherry sync with 92C_92D, 20110701 GetDualBandChannelList
+u1Byte
+RtGetDualBandChannel(
+ IN PADAPTER Adapter,
+ OUT PRT_CHNL_LIST_ENTRY ChnlListEntryArray
+)
+{
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+ pu1Byte pChnlList;
+ u1Byte listLen;
+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
+ u1Byte i, ChannelLen = 0;
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD,("============> RtGetDualBandChannel \n"));
+
+ if(IS_DOT11D_ENABLE(pMgntInfo))
+ { // dot11d is enabled.
+ RT_SCAN_TYPE scanType = SCAN_ACTIVE;
+
+ if(!IS_COUNTRY_IE_VALID(pMgntInfo))
+ { // domain learning is not complete
+ scanType = SCAN_PASSIVE;
+ }
+
+ if(IS_COUNTRY_IE_VALID(pMgntInfo))
+ {
+ listLen = pDot11dInfo->ChnlListLen;
+ pChnlList = pDot11dInfo->ChnlList;
+ }
+ else
+ {
+ listLen = sizeof(s_MaxChnlList);
+ pChnlList = s_MaxChnlList;
+ }
+
+ if(listLen > MAX_CHANNEL_NUM)
+ listLen = MAX_CHANNEL_NUM;
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD,("RtGetDualBandChannel: Dot11d case listLen %d \n", listLen));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("ChannelNum"));
+
+ for(i = 0; i < listLen; i ++)
+ {
+ ChnlListEntryArray[i].ChannelNum = pChnlList[i];
+
+ // For 5G FCC Radar channel, default passive scan
+ if(DFS_5G_RADAR_CHANNEL(ChnlListEntryArray[i].ChannelNum))
+ ChnlListEntryArray[i].ScanType = SCAN_PASSIVE;
+ else
+ ChnlListEntryArray[i].ScanType = scanType;
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD,(" %d ",ChnlListEntryArray[i].ChannelNum));
+ }
+
+ ChannelLen = listLen;
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("ChannelLen %d\n", ChannelLen));
+ }
+ else
+ { // Normal Case
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD,("RtGetDualBandChannel: Normal case"));
+
+ //RT_CHANNEL_DOMAIN_WW13_2G and after are in new format to support both 2.4G & 5G
+ if(pMgntInfo->ChannelPlan < RT_CHANNEL_DOMAIN_WW13_2G)
+ {
+ RT_TRACE(COMP_SCAN, DBG_LOUD,("DefaultChannelPlan[%d].Len %d \n", pMgntInfo->ChannelPlan, DefaultChannelPlan[pMgntInfo->ChannelPlan].Len));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("ChannelNum"));
+
+ for(i = 0; i < DefaultChannelPlan[pMgntInfo->ChannelPlan].Len; i ++)
+ {
+ ChnlListEntryArray[i].ChannelNum = DefaultChannelPlan[pMgntInfo->ChannelPlan].Channel[i];
+ RT_TRACE(COMP_SCAN, DBG_LOUD,(" %d ",ChnlListEntryArray[i].ChannelNum));
+ }
+
+ ChannelLen = DefaultChannelPlan[pMgntInfo->ChannelPlan].Len;
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("ChannelLen %d\n", ChannelLen));
+ }
+ else
+ {
+ RT_TRACE(COMP_SCAN, DBG_LOUD,("DefaultChannelPlan[%d].Len2_4G %d \n", pMgntInfo->ChannelPlan, DefaultChannelPlan[pMgntInfo->ChannelPlan].Len2_4G));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("ChannelNum"));
+
+ for(i = 0; i < DefaultChannelPlan[pMgntInfo->ChannelPlan].Len2_4G; i++)
+ {
+ ChnlListEntryArray[i].ChannelNum = DefaultChannelPlan[pMgntInfo->ChannelPlan].Channel2_4G[i];
+ RT_TRACE(COMP_SCAN, DBG_LOUD,(" %d ",ChnlListEntryArray[i].ChannelNum));
+ }
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD,("DefaultChannelPlan[%d].Len5G %d \n", pMgntInfo->ChannelPlan, DefaultChannelPlan[pMgntInfo->ChannelPlan].Len5G));
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("ChannelNum"));
+
+ ChannelLen = DefaultChannelPlan[pMgntInfo->ChannelPlan].Len2_4G;
+ for(i = 0; i < DefaultChannelPlan[pMgntInfo->ChannelPlan].Len5G; i++)
+ {
+ ChnlListEntryArray[ChannelLen].ChannelNum = DefaultChannelPlan[pMgntInfo->ChannelPlan].Channel5G[i];
+ RT_TRACE(COMP_SCAN, DBG_LOUD,(" %d ",ChnlListEntryArray[ChannelLen].ChannelNum));
+ ChannelLen++;
+ }
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD, ("ChannelLen %d\n", ChannelLen));
+ }
+
+
+ for(i = 0; i < ChannelLen; i ++)
+ {
+ // For 5G FCC Radar channel, default passive scan
+ if(DFS_5G_RADAR_CHANNEL(ChnlListEntryArray[i].ChannelNum))
+ ChnlListEntryArray[i].ScanType = SCAN_PASSIVE;
+ else
+ ChnlListEntryArray[i].ScanType = SCAN_ACTIVE;
+ }
+ }
+
+ RT_TRACE(COMP_SCAN, DBG_LOUD,("pMgntInfo->ChannelPlan %d \n",pMgntInfo->ChannelPlan));
+
+ ChannelLen = RtCustomizeChannelList(pMgntInfo, pMgntInfo->ChannelPlan, ChannelLen, ChnlListEntryArray);
+
+ return ChannelLen;
+}
+
+